String和StringBuffer
1 String: 常量不可变,声明时即在内存(堆)中分配固定长度,且之后不可修改。适用于不易修改的字符串。
2 StringBuffer: 变量可修改,new对象时会在内存(堆)中新建一段字符缓冲区。适用于频繁修改的字符串,且线程安全。
如上图
67行执行之后,a和b引用同一对象"123",8行a+"123"会形成一个新的对象,即在内存(堆)中新分配的一个固定长度块("123123"),a引用这个新的对象。10行同理,再c后拼接"456",形成一个新的对象。
Stringbuffer对象的更改操作不会新建对象,new时会分配一个字符缓冲区,若操作字符的长度大于缓冲区长度,则会扩展缓冲区。
Java的StringBuffer关于容量长度的源码
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2; //新容量等于“旧容量的2倍加2个字符”
if (newCapacity - minimumCapacity < 0) //如果翻倍后,容量仍比需要的容量小,就用后者
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity); //获得新容量
}