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()--獲取字符串的長度;
就醬紫。