java基礎知識**String,StringBufffer,StringBuilder的區別

String,StringBufffer,StringBuilder的區別

1.可變不可變方面

 String類中使用字符數組保存字符串  ,final 修飾當然是不可變的,用String來操作字符串的時候,一旦我們字符串的值改變,就會在內存創建多一個空間來保存新的字符串,即當用String操作字符串時,實際上是在不斷的創建新的對象,而原來的對象就會變爲垃圾被GC回收掉,一旦遇到複雜的操作,String非常低效

private final char value[];

StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,如下就是,可知這兩種對象都是可變的。每當我們用它們對字符串做操作時,實際上是在一個對象上操作的。所以,一般涉及到字符串操作的,我們一般使用StringBuffer或者StringBuilder   

char[] value;

2.線程安全方面:

String不可變,當然是安全的

  AbstractStringBuilder(抽象類)是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。抽象類與接口的其中一個區別是:抽象類中可以定義一些子類的公共方法,子類只需要增加新的功能,不需要重複寫已經存在的方法;而接口中只是對方法的申明和常量的定義。

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

StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的,常用於多線程安全。因爲StringBuffer要維持同步鎖,這肯定要消耗部分資源,執行比StringBuilder慢。

public synchronized StringBuffer reverse() {
    super.reverse();
    return this;
}

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

StringBuilder並沒有對方法進行加同步鎖,所以是非線程安全的。但是如果是單線程,舊可以直接用StringBuilder。

3.使用場景(效率:StringBuilder>StringBuffer>String)

  • 如果要操作少量的數據用 = String
  • 單線程操作字符串緩衝區 下操作大量數據 = StringBuilder
  • 多線程操作字符串緩衝區 下操作大量數據 = StringBuffer

4.下面是StringBuilder 常用的方法

StringBuilder append(參數)--將追加內容到當前StringBuilder對象的末尾;

StringBuilder insert(位置,參數)--將內容插入到StringBuilder對象的指定位置; str.insert(4, "!");  //在第5個位置插入 !

StringBuilder delete(初始位置,結束位置) --刪除偏移的字符串

String toString()--將SringBuilder 對象轉換爲String對象;

int length()--獲取字符串的長度;

 

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