一、String
- String是引用類型,創建並初始化以後不能改變字符串內容,但可以改變字符串變量指向不同內存區域的字符串。
- String在效果上相當於是char[ ](字符數組),但是在底層原理上是byte[ ](字節數組)。
String的比較
String由於是引用類型,所以比較兩個字符串內容是否相同時,不能直接使用 ==
進行比較,必須使用equals()
函數進行比較。
因爲==
比較的地址是否相同,然而String
是引用類型會存在地址不同而字符串內容相同的情況。
注:只有在相同字符串(順序和大小寫全相同)常量賦值的時候,兩個字符串使用==
纔可能出現true的情況。
String對象的內存原理
public static void main(String[] args) {
char[] chars = {'a','b','c'};
String s1 = new String(chars);
String s2 = new String(chars);
String s3 = "abc";
String s4 = "abc";
System.out.println(s1 == s2 ? "true": "false"); // false
System.out.println(s1 == s3 ? "true": "false"); // false
System.out.println(s3 == s4 ? "true": "false"); // true
}
字符串變量直接賦值字符串,JVM會在常量池中先尋找時候已經存在此字符串常量,要是存在直接引用常量池中字符串地址,不會在創建新的字符串變量;要是不存在,JVM會在常量池中爲這個字符串常量開闢空間,之後讓被賦值字符串變量引用這個字符串常量地址,也不會爲被賦值字符串開闢新的內存空間。總而言之,只有new
操作會在內存中開闢新的空間。
常見API查閱JDK文檔
字符串比較:boolean equals(String s)
字符串遍歷:char chartAt(int index)
字符串長度:int length()
字符串替換:String replace(char olderChar, char newChar) , String replaceAll(String regex, String replacement)
字符串截取:String subString(int begin,int end(可選))
二、StringBuilder
String字符串拼接的內存原理,說明爲什麼需要StringBuilder
public static void main(String[] args) {
String s = "hello";
s += "world";
System.out.println(s); // “helloworld”
}
如此看來,每一次拼接出新的字符串都會內存中開闢新的空間,要是這樣的操作過於頻繁,一定會影響程序的性能。
StringBuilder
的作用就是防止這種情況的出現,如果使用了StringBuilder
,可以調用append()
函數實現字符串拼接,他返回值是對象本身,可以支持鏈式操作。
因此,在String
類型字符串需要頻繁對內容進行改動的時候可以構造StringBuilder
對象,其中StringBuilder
的構造函數就支持直接通過String
對象來創建StringBuilder
對象,在字符串內容操作完成以後通過toString()
方法轉換爲String
對象。
StringBuilder常用函數參考JDK文檔
字符串拼接:StringBuilder append(任意類型)
字符串反轉:StringBuilder reverse()
字符串的插入:StringBuilder insert(int offset, 任意類型)
字符串截取刪除:StringBuilder delete(int start, int end)
字符串刪除指定位置字符:StringBuilder deleteCharAt(int index)