日期:2014-05-20  浏览次数:20691 次

关于StringBuilder append()方法的疑问

StringBuffer sb=new StringBuilder();
sb.append(“aaaaaaaaaaaaaaaaaa”);//超过16个字符
若需要扩容,会调用expandCapacity(int minimumCapacity)方法:

void expandCapacity(int minimumCapacity) {  
        ……//省略判断newCapacity的过程
        value = Arrays.copyOf(value, newCapacity);  //sb最初指向value区域
}  
而copyOf()方法又需要创建新的char数组copy:

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区域
从源码分析,是不是表示sb最先指向的的value内存区域,在扩容后变成指向copy区域了,而最初的value区域与copy区域是独立的?可若扩容前后sb指向的是两片不同的内存区域,则下面的代码中关于函数传址过程又解释不通,新手求解:
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不是啊。