技术类电子书大放送:电子书
一、String
String属于字符串常量,每次+=操作时其实都会创建一个新对象返回,原对象不会发生任何改变,因此在大量字符串拼接的场景中使用String类型会导致对象爆炸。
字符串不可变的优点:便于字符串共享
字符串存储在公共的常量池中,当将某个字符串数据copy一份时,由于是不可变的,即该块内存地址中的数据是不会发生改变的,那么基于不可变性我们不需要再新申请一份地址存储相同的数据,我们只需要要将引用变量指向原来的那块内存地址即可。试想如果String是可变的,那么我们拷贝多份某个字符串后,由于他们均共享同一块内存,那么通过其中某一个变量的地址对数据进行了修改,那么其他的变量在浑然不知的情况下也发生了变化,那么这种场景肯定是需要避免的。
总而言之,Java的设计者认为共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率。[引自:Java核心技术 卷1]
二、StringBuilder
StringBuilder属于字符串变量,非线程安全,在大量字符串场景下并且不要求线程安全时可以使用StringBuilder。从append源码我们可以看出每次字符串拼接返回的均是this.
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
三、StringBuffer
StringBuffer也属于字符串变量,其实对StringBuilder的封装,唯一不同的是StringBuffer的所有方法上加了synchronized关键字来保证线程安全。append源码举例如下:
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}