写在前面:
String、StringBuilder、StringBuffer都是Java用于定义一个字符串,三者看着相似,但在效率,线程安全方面有着区别。这篇博客就进行一些总结。
String:
String大概是我们学习Java SE最先接触到的一个关键字了,String是字符串常量,String对象一旦创建之后,不会改变。
package string;
public class StringDemo {
public static void main(String[] args) {
String arr = "abc";
arr = arr + "def";
System.out.println(arr);
}
}
在这段代码中,我们可以看出,arr初始化为“abc”,又拼接上“def”,事实上String对象的确没有改变,在拼接“def”的时候,是又创建了一个String对象,arr指向了新的引用地址。(参考之前的博客:http://blog.csdn.net/may_3/article/details/79125706)
StringBuilder:
StringBuilder是可变类,StringBuilder的构造方法,默认会构建长度为16的数组空间,如果初始化的字符串长度>16,则会扩容。
public StringBuilder() {
super(16);
}
扩容方法的源码在StringBuilder的父类-AbstractStringBuilder如下:
public void ensureCapacity(int minimumCapacity) {
if (minimumCapacity > 0)
ensureCapacityInternal(minimumCapacity);
}
但StringBuilder是不保证同步的,且不像String每次修改,就会重写创建对象,所以运行效率很快。
StringBuffer:
首先StringBuffer是线程安全的,StringBuffer的append方法都是由synchronized修饰。
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
这样做保证了StringBuffer类在多线程并发修改字符串时候,保证了字符串的修改安全。但是效率会低于StringBuilder。