StringBuffer和StringBuilder的區別是StringBuffer是線程安全的,StringBuilder則不是,因此當不考慮線程安全的時候,StringBuilder效率更高。java
我的理解,水平不夠,還請指正。數組
一、CharSequence安全
String實現了三個接口,其中一個是CharSequence,StringBuilder和StringBuffer也都實現了這個接口函數
CharSequence接口中有這些東西:ui
int length();//返回char序列的長度,即有多少個字符在這個序列中spa
char charAt(int index);//返回特定位置的字符,從0到length()-1線程
CharSequence subSequence(int start, int end);//返回子序列,從0到length()-1code
public String toString();//返回與char序列一樣字符順序的String對象對象
有些函數就會以CharSequence做爲參數,能夠將String,StringBuffer,StringBuilder做爲參數參入。繼承
二、String StringBuffer的屬性
1.1String屬性
private final char value[];//用於字符存儲,是final類型的
String str = "abc";
至關於
char data[] = {'a', 'b', 'c'};
String str = new String(data);
String的構造函數會初始化value數組,一旦初始化就不能改變了。
因此若是str = "def";只是改變了str的引用,變爲"def"字符串的引用了。"abc"、"def"是兩個堆區中的對象。
1.2StringBuffer屬性
StringBuffer繼承於AbstractStringBuilder
AbstractStringBuilder中的屬性有
char[] value;
int count;
能夠看到StringBuffer中的這裏的value不是final的。
在任什麼時候間點都有一個特有的字符序列,其長度和內容能夠經過StringBuffer中的方法改變。
下面具體看看StringBuffer的方法。
length()獲得是有多少個字符。
public int length() {
return count;
}
capacity()獲得是value數組分配的長度
public int capacity() {
return value.length;
}
當新分配的容量比原來的capacity大時,會進行擴容
這個expandCapacity方法並無進行大小檢查和同步處理,其餘方法在調用時須要先作判斷
/**
* This implements the expansion semantics of ensureCapacity with no
* size check or synchronization.
*/
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
//這個地方的判斷沒看懂,什麼狀況下會<0
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
Arrays.copyOf(value, newCapacity)
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
System.arraycopy
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
最後經過System.arraycopy來進行數組擴充內容,由於這個函數是native的,效率比較高
未完。。