若需要扩容,会调用expandCapacity(int minimumCapacity)方法:
StringBuffer sb=new StringBuilder();
sb.append(“aaaaaaaaaaaaaaaaaa”);//超过16个字符
而copyOf()方法又需要创建新的char数组copy:
void expandCapacity(int minimumCapacity) {
……//省略判断newCapacity的过程
value = Arrays.copyOf(value, newCapacity); //sb最初指向value区域
}
从源码分析,是不是表示sb最先指向的的value内存区域,在扩容后变成指向copy区域了,而最初的value区域与copy区域是独立的?可若扩容前后sb指向的是两片不同的内存区域,则下面的代码中关于函数传址过程又解释不通,新手求解:
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength]; //创建copy数组,开辟了新的内存区
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy; //扩容后,value指向了copy区域
}
public class StringTest{
void stringBufferAppend(StringBuffer sbTemp){
sbTemp=sbTemp.append("aaaaaaaaaaaaaaaaaa");
//若指向不同区域,则形参append操作后扩容,指向了新区域,与实参无关系,
//sb输出应还是"hello",可实际不是,因此猜想扩容前后应还是同一片内存区域,
//大小有所变化,首地址相同,但从源码如何解释?
}
public static void main(String[] args){
StringTest st=new StringTest();
StringBuffer sb=new StringBuffer("hello");
st.stringBufferAppend(sb);
System.out.println("sb= "+sb);
}
}
------解决方案--------------------
sb是指向原来的区域,
但sb的value不是啊。