Java_String

不可變的字符串:String 創(chuàng)建完畢之后內(nèi)容不能改變,改變之后就是一個新的對象;

可變的字符串:StringBuilder \ StringBuffer,當該對象創(chuàng)建完畢之后,當內(nèi)容發(fā)生改變時,對象保持不變

字符串的本質:一個char類型的數(shù)組;String其實就是對插入數(shù)組的封裝;

String對象的創(chuàng)建

通過字面量: String str1 = "hello";
最多創(chuàng)建一個對象,最少不創(chuàng)建對象;
如果在常量池中存在所創(chuàng)建的對象,那么此時可以 直接引用 不創(chuàng)建String對象
否則 先在常量池創(chuàng)建內(nèi)存空間 在引用

通過構造器: String str2 = "hello";
至少創(chuàng)建一個String對象 最多創(chuàng)建兩個String對象
new關鍵字絕對會在堆空間創(chuàng)建內(nèi)存空間 所以至少創(chuàng)建一個對象;

區(qū)分:

String對象的空值:
表示引用為空: String str1 = null; 沒有初始化,沒有分配內(nèi)存空間
表示內(nèi)容為空: String str2 = ""; 已經(jīng)初始化,分配內(nèi)存空間,不過沒有內(nèi)容

判斷字符串非空:

if(str != null && str!''''.equals()(str.trim())){
System.out.println("非空");
}else{
System.out.println("空");
}

字符串的比較操作:

使用 "==": 只能比較引用的內(nèi)存地址是否相同
使用equals()方法: 在Object類中和 "==" 相同,建議子類覆蓋 ; 去比較內(nèi)容; String中覆蓋了該方法,比較的是字符串內(nèi)容;

單獨使用 " " 創(chuàng)建的字符串都是直接量 , 編譯時期就已經(jīng)存儲在常量池中;
使用new String(" ")創(chuàng)建的字符串會存儲在堆空間中,在運行事情才會創(chuàng)建;
使用包含直接量字符串連接符進行連接創(chuàng)建的字符串 , 也是直接量在編譯時期就已經(jīng)存儲在常量
池中;
使用包含String直接量(無final修飾符) 的字符串表達式創(chuàng)建的字符串表達式,(s1 + "aa") 創(chuàng)建的對
象是運行時期才創(chuàng)建的,存儲在堆中;
(通過變量/調(diào)用方法去連接字符串,都只能在運行時期才能確定變量的值和方法的返回值,不存在編譯器優(yōu)化)


String的相關操作:

char[]數(shù)組和byte[]數(shù)組 與 String字符串的相互轉化;

  • String str1 = new String(char[]數(shù)組);//把char數(shù)組轉化為字符串
  • String類型.toCharArray();//把String字符串轉化為char[]數(shù)組;
  • String字符串.geBytes();//把字符串轉化為byte[]數(shù)組;
  • String str2 = new String(byte[]數(shù)組);//把byte[]數(shù)組轉化為String字符串;

獲取字符串信息:

  • int len1 = String.length();//獲取一個字符串的長度
  • char ch1 = String.charAt(index 索引值);//返回索引值所對應的char值;
  • int num1 = String.indexOf(String 子字符串); // 返回子字符串在父字符串中第一次出現(xiàn)的索引;
  • int num1 = String.lastIndexOf(String 子字符串);//返回子字符串在父字符串中最后一次出現(xiàn)的索引;

字符串的大小寫轉換:

  • String.toUpperCase();//把字符串全部轉換為大寫
  • String.toLowerCase();//把字符串全部轉換為小寫
  • String[] 數(shù)組名 = String字符串.split(正則表達式);
  • 根據(jù)給定的正則表達式拆分字符串;

startsWith(String 判定條件);// 字符串是否以判定條件為開頭;

String在做字符串拼接時效率極低;因為String是不可改變的,每次連接字符串都是創(chuàng)建新的對象;
Stringbuffer與Stringbuilder的區(qū)別;
都表示可變的字符串,功能方法都是相同的;
區(qū)別在于:
StringBuffer中的方法都使用了synchronized修飾符,表示同步的,在多線程并發(fā)的時候可以保證線程安全問題;性能較低;
StringBuilder都沒有使用synchronized修飾,不安全,但性能較高;
建議使用StringBuilder;線程安全問題可以解決;

使用StringBuilder的默認無參數(shù)構造器,在底層默認創(chuàng)建了一個長度為16的char數(shù)組;
此時該數(shù)組只能存儲16個字符,如果超過了,則會自動擴容;(創(chuàng)建更長的數(shù)組,再把之前的數(shù)組拷貝過去,效率低);
一般的,事先大概知道需要存儲多少字符,應該直接傳入?yún)?shù);

常用操作:
StringBuilder.append(object obj);//往當前字符串追加內(nèi)容
StringBuilder deleteCharAt();//刪除指定位置的字符串;
StringBuilder.reverse();//字符串的反轉操作;

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容