Java中的append( )方法其實是創建了壹個新的數組,擴大了長度,將需要添加的字符串給復制到這個新的數組中。
JAVA中Stringbuffer有append( )方法:
而Stringbuffer是動態字符串數組,append( )是往動態字符串數組添加,跟“xxxx”+“yyyy”相當‘+’號。
跟String不同的是Stringbuffer是放壹起的,String1+String2和Stringbuffer1.append("yyyy")雖然打印效果壹樣,但在內存中表示卻不壹樣、
String1+String2 存在於不同的兩個地址內存,Stringbuffer1.append(Stringbuffer2)放再壹起。
StringBuffer是線程安全的,多用於多線程。
擴展資料
查看StringBuffer的append()方法
如圖所示代碼:
1、進入append方法
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
其中toStringCache是Cleared whenever the StringBuffer is modified.
2、進入AbstractStringBuilder的append()方法
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
如果參數str為空返回appendNull(); 該方法最終返回return this.
3、進入ensureCapacityInternal()方法
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
copyOf(char[] original, int newLength)的方法查JDK幫助文檔可知:復制指定的數組,復制具有指定的長度。
4、進入String的getChars()方法
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {//0,len=5,value=[hello],count=5
if (srcBegin < 0) {
throw new StringIndexOutOfBoundsException(srcBegin);
}
if (srcEnd > value.length) {
throw new StringIndexOutOfBoundsException(srcEnd);
}
if (srcBegin > srcEnd) {
throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
}
System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
}
5、最終調用的是System.arraycopy的方法:
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
/*src - 源數組。
srcPos - 源數組中的起始位置。
dest - 目標數組。
destPos - 目的地數據中的起始位置。
length - 要復制的數組元素的數量。?
*/
System.arraycopy([world], 0, [hello], 5, 5);
將指定源數組中的數組從指定位置復制到目標數組的指定位置。
參考資料: