public class MainClass { public static void main(String[] args) throws Exception { MainClass mc = new MainClass(); MyStringBuffer msb = new MyStringBuffer(); System.out.println(msb); mc.stringBufferAppend(msb); System.out.println(msb); System.out.println(Arrays.toString(msb.value)); }
我看到的是直接调用AbstractStringBuilder的append方法就完事了:
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}BTW,楼上正解!
数组是定长的,你怎么直接变它?是通过新建一个长一点的数组,然后进行数组复制,再赋值,源码继续看下去
System.out.println("ary原内存区域:"+ary);
ary=Arrays.copyOf(ary,ary.length+1);
System.out.println("ary扩容后内存区域:"+ary);
很明显扩容前后ary数组的位置不同,如果是这样,我帖子中最后一段代码,方法传址就解释不了最后的结果。
就这样,你看看怎么解释吧。
char[] a = new char[10];
char[] b = new char[20];
a = b;
但sb的value不是啊。
sbOrg=sb;
System.out.println("扩容前sb容量"+sb.capacity());
sb.append("aaaaaaaaaaaaaaaaaa");
System.out.println("扩容后sb容量"+sb.capacity());
System.out.println(sbOrg);
System.out.println(sb);
append方法扩容前后指向的是同一片区域,引用变量的赋值问题我知道,就是因为知道才有疑惑
sb的区域存了一个引用变量value,value指向了实际存储的区域,在扩容时,value指向了新区域
public class MainClass { public static void main(String[] args) throws Exception {
MainClass mc = new MainClass();
MyStringBuffer msb = new MyStringBuffer();
System.out.println(msb);
mc.stringBufferAppend(msb);
System.out.println(msb);
System.out.println(Arrays.toString(msb.value));
}
void stringBufferAppend(MyStringBuffer sbTemp){
sbTemp=sbTemp.append("aaaaaaaaaaaaaaaaaa");
}
}class MyStringBuffer{
char[] value={'b'};
public MyStringBuffer append(String str)
{
char[] copy = new char[str.length()+value.length];
System.arraycopy(value, 0, copy, 0, value.length);
System.arraycopy(str.toCharArray(), 0, copy, value.length, str.length());
value= copy;
return this;
}
}看看我这个例子
你确定?sb和value是不一样的喔