StringBuffer buffer = new StringBuffer();
buffer.append('S');
buffer.append("tringBuffer");
System.out.println(buffer.charAt(1));
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("tring"));
System.out.println("buffer = " + buffer.toString()); //这段代码为什么是16 ? 不是创建buffer空对象就已经是16,然后应该是16+"StringBuffer"=28呀 StringBuffer buffer = new StringBuffer("wish");
System.out.println(buffer.toString());
System.out.println(buffer.length());
System.out.println(buffer.capacity());
buffer.setCharAt(0,'W');
buffer.append('!');
buffer.append(" Here we are!");
buffer.insert(0, "Hello ");
System.out.println(buffer.toString());//Hello Wish! Here we are!
System.out.println(buffer.length());//24
System.out.println(buffer.capacity());//24+16=40
//而这段应该是40啊 不懂 请高手指教
buffer.append('S');
buffer.append("tringBuffer");
System.out.println(buffer.charAt(1));
System.out.println(buffer.capacity());
System.out.println(buffer.indexOf("tring"));
System.out.println("buffer = " + buffer.toString()); //这段代码为什么是16 ? 不是创建buffer空对象就已经是16,然后应该是16+"StringBuffer"=28呀 StringBuffer buffer = new StringBuffer("wish");
System.out.println(buffer.toString());
System.out.println(buffer.length());
System.out.println(buffer.capacity());
buffer.setCharAt(0,'W');
buffer.append('!');
buffer.append(" Here we are!");
buffer.insert(0, "Hello ");
System.out.println(buffer.toString());//Hello Wish! Here we are!
System.out.println(buffer.length());//24
System.out.println(buffer.capacity());//24+16=40
//而这段应该是40啊 不懂 请高手指教
//这段代码为什么是16 ? 不是创建buffer空对象就已经是16,然后应该是16+"StringBuffer"=28呀
new StringBuffer();初始一个容量为16的StringBuffer对象
append("tringBuffer");后,容量还是16,因为StringBuffer长度是12,没有超出16
当字符串的长度大于16时,StringBuffer扩充为(原容量 + 1) * 2new StringBuffer("wish");
容量为"wish"的长度 4+16 = 20;
扩充容量 (20+1)* 2 = 42看看StringBuffer的源码,是通过一个char数组实现的
public StringBuffer() {
super(16);
}//默认初始16
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}//另一种构造方式再看一下他的父类的源码
abstract class AbstractStringBuilder implements Appendable, CharSequencechar value[];//内部维护一个char数组
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}void expandCapacity(int minimumCapacity) {
int newCapacity = (value.length + 1) * 2;
if (newCapacity < 0) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
value = Arrays.copyOf(value, newCapacity);
}//扩充容量
其实ArrayList,LinkedList都差不多,只是增量不一样而以。,楼主认真去理解吧。