基礎——String和StringBuilder

一、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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章