他们都是java中与字符串有关的类
String
不可变的,每次改变都会重新生成一个对象,因为其中是一个final类型的字符数组。
private final char value[];
StringBuffer和StringBuilder是可变的,因为他们其中的字符数组是可变的,
默认大小16个,当每次增加的时候,都去判断他的容量是否充足,如果不充足就重新new一个字符串数组,并把原来的内容通过Arrays的方法拷贝过去。
//扩大容量,进行拷贝
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 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);
}
char[] value;
public StringBuffer() {
super(16);
}
这让我想起大一学c语言的时候,老师让我们用数组写线性表,对容量进行处理的时候也是跟他的方法一样,现在已经大三了,唉。
StringBuffer和StringBuilder的区别就是
StringBuffer是线程安全的,StringBuilder是线程不安全的。
//StringBuffer的append方法
public synchronized StringBuffer append(StringBuffer sb) {
super.append(sb);
return this;
}
StringBuffer的一些方法 加上了 synchronized 关键字,在方法上加管自己就相当于synchronized(this)
当然,线程安全就意味着速度会慢一些。