天天看點

java String類 StringBuilder和StringBuffer類的差別

String、StringBuffer、StringBuilder是java程式設計中經常使用的字元串類,我們在初學的時候,都會對Java的記憶體配置設定及使用有更深的了解。 特别在面試中也會經常會被問到這樣的問題。是以在此總結一下:

底層代碼解析   String類中使用字元數組儲存字元串,如下就是,因為有“final”修飾符,是以可以知道string 對象是不可變的。 private final char value[]; StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字元數組儲存字元串,如下就是,可知這兩種對象都是可變的。 char[] value;

字元串連接配接操作中StringBuffer,StringBuilder的效率要比String高: 關于以上具體解釋如下: 在java中有3個類來負責字元的操作。 1.Character 是進行單個字元操作的, 2.String 對一串字元進行操作。不可變類。 3.StringBuffer,StringBuilder 也是對一串字元進行操作,但是可變類。 String: 是對象不是原始類型. 為不可變對象,一旦被建立,就不能修改它的值. 對于已經存在的String對象的修改都是重新建立一個新的對象,然後把新的值儲存進去. String 是final類,即不能被繼承. StringBuffer,StringBuilder: 是一個可變對象,當對他進行修改的時候不會像String那樣重建立立對象 它隻能通過構造函數來建立, 由于String 對象是不可變對象,每次操作Sting 都會重建立立新的對象來儲存新的值. 這樣原來的對象就沒用了,就要被垃圾回收.這也是要影響性能的.  最後,如果程式不是多線程的,那麼使用StringBuilder效率高于StringBuffer。

線程安全問題  String中的對象是不可變的,也就可以了解為常量,顯然線程安全 AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字元串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。 StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,是以是線程安全的 。 StringBuilder并沒有對方法進行加同步鎖,是以是非線程安全的。