天天看點

《JavaSE必備知識》:字元串、StringBuffer類和StringBuilder類重點知識詳解。

參賽話題:Java學習記錄

話題描述:每個人學習的路線不同,學習的方式視訊教學和跟的老師不同,一個知識點會多種不同的講解之法,下面這篇文章記錄了我的學習記錄并且我不懂或漏掉的知識點又去找其他書籍進行了補充,我覺得依舊不是最完整的,等我遇到了還會對這部分知識點進行補充。

目錄

一、前言

二、字元串的注意事項

1、細節部分

2、兩種方式建立String 對象

 三、StringBuffer 類

1、細節部分

2、StringBuffer 和 String 之間互相轉換

四、StringBuilder 類 

細節部分

五、 String類、StringBuffer類 和 StringBuilder類比較

Ⅰ、三者的差別

Ⅱ 三者的效率及使用原則

一、前言

  • 學習概述:這篇文章主要介紹Java的字元串類型,字元串的常用方法我在前面的文章已經介紹過,這一篇主要介紹它的細節,平時使用字元串時需要注意的地和易錯易混的地方,其中有比較長用的StringBuffer類和StringBuilder類的細節詳解。
  • 學習目标:學習了這篇文章之後,要掌握字元串的常見易錯的地方;StringBuffer類和StringBuilder類的細節及StringBuffer類與字元串之間的轉換;字元串、StringBuffer類和StringBuilder類三者的比較,什麼時候用哪一個類必須要掌握。

二、字元串的注意事項

1、細節部分

▷ String儲存的是字元串常量,裡面的值不能更改,每次String類的更新實際上就是更改位址,效率較低,(private final char value[];)。

▷ 字元串的字元使用 Unicode 字元編碼,一個字元(不區分字母還是漢字)占兩個位元組

▷ String 類有很多構造器 ---> 構造器的重載

▷ String 類實作了接口 Serializable(String 可以串行化:可以在網絡傳輸) 和 接口 Comparable (String 對象可以比較大小)

▷ String 是 final 類,不能被其他的類繼承,同時代表不可變字元串序列,一個字元串對象一旦被配置設定,其内容是不可變的

▷ String 有屬性 private final char value[]; 用于存放字元串的内容。value 是一個 final 類型, 不可以修改:即 value 不能指向新的位址,但是單個字元内容是可以變化

▷ 注意: 一個空字元串并不是說它的值等于null (空值),空字元串和null(空值)是兩個概念。空字元事是由空的 " " 符号定義的,它是執行個體化之後的字将串對象,但是不包含任何字元。

2、兩種方式建立String 對象

方式一:直接指派 String s1 = "hello";

    解釋:先從常量池檢視是否有"hello"資料空間,如果有,直接指向:如果沒有則重新建立,然後指向。s1最終指向的是常量池的空間位址

..................................................................................................................................................

方式二: 調用構造器 String s2 = new String("hello");

   解釋:先在堆中建立空間,裡面維護了value屬性,指向常量池的hello空間。如果常量池沒有"hello",重新建立,如果有,直接通過value指向。最終指向的是堆中的空間位址。

圖示:

《JavaSE必備知識》:字元串、StringBuffer類和StringBuilder類重點知識詳解。

 三、StringBuffer 類

1、細節部分

▶ StringBuffer 的直接父類 是 AbstractStringBuilder

▶ StringBuffer 實作了 Serializable, 即 StringBuffer 的對象可以串行化

▶ 在父類中 AbstractStringBuilder 有屬性 char[] value,不是 final 類,該 value 數組存放字元串内容,字元序列存放在堆中的。

▶ StringBuffer 是一個 final 類,不能被繼承

▶ StringBuffer儲存的是字元串變量,裡面的值可以更改,每次StringBuffer 的更新實際上是可以隻更新内容的,不用每次更新位址,效率較高,(char[ ] value;  --->這個放在堆中)。

2、StringBuffer 和 String 之間互相轉換

1、String —> StringBuffer :
String str = "hello tom"; 

//方式一 :使用構造器 
StringBuffer str1 = new StringBuffer(str); 
//注意: 傳回的str1才是 StringBuffer 對象,對 str 本身沒有影響(不變) 


//方式二 :使用的是 append 方法 
StringBuffer str2 = new StringBuffer(); 
str2 = str2.append(str);      
2、StringBuffer ---> String :
StringBuffer str = new StringBuffer("jack");

//方式一 : 使用 StringBuffer 提供的 toString 方法 
String str1 = str.toString();


//方式二 : 使用構造器來搞定 
String str2 = new String(str);      
3、StringBuffer 類構造器
構造方法 解釋
StringBuffer() 構造個其中不帶字元的字元串緩沖區,其初始容量為16個字元。
StringBuffer(CharSequence seq) public java.lang.StringBuilder(CharSequencese)構造一個字元串緩沖區,它包含與指定的Char Sequence相同的字元。
StringBuffer(int capacity) //capacity[容量] 構造一個不帶字元, 但具有指定初始容量的字元串緩沖區,即對 char[]大小進行指定
StringBuffer(String str) 構造一個字元串緩沖區,并将其内容初始化為指定的字元串内容。

四、StringBuilder 類 

細節部分

▶ StringBuilder 的直接父類 是 AbstractStringBuilder 類

▶ StringBuilder 實作了 Serializable, 即 StringBuilder 的對象可以串行化

▶ 在父類中 AbstractStringBuilder 有屬性 char[] value,不是 final 類,該 value 數組存放 字元串内容,字元序列存放在堆中的。

▶ StringBuilder 是一個 final 類,不能被繼承

▶ 因為 StringBuilder 字元内容是存在 char[] value, 是以在變化(增加/删除) 不用每次都更換位址(即不是每次建立新對象), 是以效率高于 String 類

▶ StringBuilder 的方法,沒有做互斥的處理,即沒有 synchronized 關鍵字,是以在單線程的情況下使用 StringBuilder

五、 String類、StringBuffer類 和 StringBuilder類比較

Ⅰ、三者的差別

        1、String是不可變的,StringBuffer和StringBuilder都是可變的。

        2、String不可變,可視為常量,是以線程安全; StringBuffer使用時加了同步鎖,是以是線程安全的; StringBuilder 沒加鎖,是以不是線程安全的。

        3、操作少量資料用String;單線程字元串緩沖區下操作大量資料用StringBuilder;多線程字元串緩沖區下操作大量資料用StringBuffer。

簡化比較:

        ▷ String : 不可變字元序列,效率低,但是複用率高。

        ▷ StringBuffer : 可變字元序列、效率較高(增删)、線程安全

        ▷  StringBuilder : 可變字元序列、效率最高(增删)、線程不安全

注意:

        ▷ StringBuilder和StringBuffer非常類似,均代表可變的字元序列,而且方法也一樣

        ▷ String注意事項:

                string s="a";    //建立了一個字元串

                s += "b";   

                //實際上原來的"a"字元串對象已經丢棄了。現在又産生了一個字元串s+"b" (也就是"ab")。如果多次執行這種改變字元串内容的操作,會導緻大量副本字元串對象殘留在記憶體中,降低效率,浪費空間。如果這樣的操作放到循環中,會極大影響程式的性能。是以如果我們要對字元串做大量修改,不要使用String 類。

Ⅱ 三者的效率及使用原則

 效率:         

        StringBuilder 類 > StringBuffer 類 > String 類

使用原則:

        1、如果字元串存在大量的修改操作,-般使用StringBuffer或StringBuilder

        2、如果字元串存在大量的修改操作,并且在單線程的情況,使用StringBuilder

        3、如果字元串存在大量的修改操作,并且在多線程的情況,使用StringBuffer