String 字符串类,经常使用来定义常量或者不须要动态扩展的变量,由于它是一个不可变的字符串数组,java
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 }
若是要常用“+”来修改变量的值,每作一次 + 就产生个 StringBuilder 对象,而后 append 后toString输出,接着就扔掉StringBuilder对象,屡次"+"操做就会产生屡次对象产生和销毁的开销,效率低下。
数组
StringBuffer 和StringBuilder都继承AbstractStringBuilder,这里面定义的字符串数组是非final的,说明是可变的,能够经过append等方式动态扩展安全
可是二者又是有区别的,StringBuffer的线程安全的,如:多线程
@Override public synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj)); return this; }
其操做数组的方法都是使用了同步操做的。app
而StringBuilder是非线程安全的,因此在多线程环境使用StringBuffer,其余时候使用StringBuilder线程更高一些。ide
String StringBuffer StringBuilder 三者性能为低-中-高性能