天天看點

String類、StringBuffer類、StringBuilder類的差別

String是Java中基礎且重要的類,并且String也是Immutable類的典型實作,被聲明為final class,除了hash這個屬性其它屬性都聲明為final,因為它的不可變性,是以例如拼接字元串時候會産生很多無用的中間對象,如果頻繁的進行這樣的操作對性能有所影響。

StringBuffer就是為了解決大量拼接字元串時産生很多中間對象問題而提供的一個類,提供append和add方法,可以将字元串添加到已有序列的末尾或指定位置,它的本質是一個線程安全的可修改的字元序列,把所有修改資料的方法都加上了synchronized。但是保證了線程安全是需要性能的代價的。

在很多情況下我們的字元串拼接操作不需要線程安全,這時候StringBuilder登場了,StringBuilder是JDK1.5釋出的,它和StringBuffer本質上沒什麼差別,就是去掉了保證線程安全的那部分,減少了開銷。

StringBuffer 和 StringBuilder 二者都繼承了 AbstractStringBuilder ,底層都是利用可修改的char數組(JDK 9 以後是 byte數組)。

是以如果我們有大量的字元串拼接,如果能預知大小的話最好在new StringBuffer 或者StringBuilder 的時候設定好capacity,避免多次擴容的開銷。擴容要抛棄原有數組,還要進行數組拷貝建立新的數組

String是一個不可變的字元序列,字元串常量

StringBuffer是一個可變的字元序列 ,字元串變量(線程安全)

StringBuilder 是一個可變的字元序列 ,字元串變量(非線程安全)

String對象值的修改都是重新建立一個新的對象,然後把新的值儲存進去

StringBuffer類對象,每次傳回的都是原對象,可以通過append()方法來修改值

String對象底層重寫了hascode和equals

StringBuffer對象底層未重寫了hascode和equals

StringBuffer性能比String高

StringBuffer是線程安全的

無參構造方法,Sting為空字元初始容量為0,StringBuffer初始容量為16

StringBuffer和StringBuilder的差別

StringBuffer 線程安全 同步的 速度慢

StringBuilder 線程不安全 非同步的 速度快

  • 1.Character 是進行單個字元操作的,
  • 2.String 對一串字元進行操作,不可變類。
  • 3.StringBuffer 對一串字元操作,可變類
  • 4.StringBuilder 對一串字元操作,可變類
 String類中使用字元數組儲存字元串,如下就是,因為有“final”修飾符,是以可以知道string對象是不可變的。

    private final char value[];

我的了解:String對象不可變:比如 String aa = new String("hello"); 

//建立一個String對象,指向一個位址,位址上的值是"hello";  

aa = "world";

//新取一段位址空間(不是原來的),值是"world",aa指向這個新的位址

aa += "!";

//新取一段位址空間(不是原來的),值是"world!",aa指向這個新的位址

//是以說String值每修改一次,記憶體裡就會建立一個字元串,String對象指向的位址也會發生改變StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字元數組儲存字元串,如下就是,可知這兩種對象都是可變的。
char[] value;