String, StringBuffer,StringBuilder的區別

Java中String、StringBuffer、StringBuilder是編程中經常使用的字符串類,他們之間的區別也是經常在面試中會問到的問題。現在總結一下,看看他們的不同與相同。

1.可變與不可變

String類中使用字符數組保存字符串,如下就是,因爲有“final”修飾符,所以可以知道string對象是不可變的。

private final char value[];

      String 爲不可變對象,一旦被創建,就不能修改它的值. . 對於已經存在的String對象的修改都是重新創建一個新的對象,然後把新的值保存進去.

StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,如下就是,可知這兩種對象都是可變的。

char[] value;

    StringBuffer:是一個可變對象,當對他進行修改的時候不會像String那樣重新建立對象, 它只能通過構造函數來建立,  如: StringBuffer sb = new StringBuffer();

不能通過賦值符號對他進行付值. sb = "welcome to here!";//error
對象被建立以後,在內存中就會分配內存空間,並初始保存一個null.向StringBuffer中賦值的時候可以通過它的append方法.     sb.append("hello");

2.是否多線程安全

String中的對象是不可變的,也就可以理解爲常量, 顯然線程安全

AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是 線程安全的 。看如下源碼:

 

1   public   synchronized  StringBuffer reverse() {

2       super .reverse();

3       return   this ;

4  }

5  

6   public   int  indexOf(String str) {

7       return  indexOf(str, 0);        //存在 public synchronized int indexOf(String str, int fromIndex) 方法

8  }

 

StringBuilder並沒有對方法進行加同步鎖,所以是 非線程安全的

 3.StringBuilder與StringBuffer共同點

StringBuilder與StringBuffer有公共父類AbstractStringBuilder( 抽象類 )。

抽象類與接口的其中一個區別是:抽象類中可以定義一些子類的公共方法,子類只需要增加新的功能,不需要重複寫已經存在的方法;而接口中只是對方法的申明和常量的定義。

StringBuilder、StringBuffer的方法都會調用AbstractStringBuilder中的公共方法,如super.append(...)。只是StringBuffer會在方法上加synchronized關鍵字,進行同步。

最後,如果程序不是多線程的,那麼使用StringBuilder效率高於StringBuffer。

 

效率比較String < StringBuffer < StringBuilder,但是在String S1 =“This is only a”+“simple”+“test”時,String效率最高。

發佈了19 篇原創文章 · 獲贊 19 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章