您的位置:首页 > 产品设计 > UI/UE

String, StringBuffer和StringBuilder

2018-03-16 16:48 417 查看
他们都是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)

当然,线程安全就意味着速度会慢一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息