String、StringBuffer与StringBuilder
-
三者的联系
String StringBuffer StringBuilder 不可变类 可变类 可变类 一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁 当一个StringBuffer被创建以后,通过StringBuffer提供的方法可以改变这个字符串对象的字符序列,一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象 和StringBuffer基本相似,两个类的构造器和方法也基本相同 线程安全 线程不安全 -
StringBuffer、String与StringBuilder源码比较
public final class StringBuffer extends AbstractStringBuilder implements Serializable, CharSequence { private transient char[] toStringCache; public StringBuffer() { super(16); } public StringBuffer(String str) { super(str.length() + 16); append(str); }//如果传入的是字符串,那么构造出来的字符串长度应该是传入的字符串长度+16 } //从上面一段StringBuffer的源码可看出,StringBuffer与StringBuilder都是继承于AbstractStringBuilder,StringBuffer中的char数组没有被final修饰,所以是可变的,且在StringBuffer中默认的字符串长度为16
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; } //从这段String的源码可以看出char数组是final修饰的,是不可变的
public final class StringBuilder extends AbstractStringBuilder implements Serializable, CharSequence { public StringBuilder() { super(16); } } //同样的,StringBuilder与StringBuffer大致相同,其中默认的字符串长度也为16
-
三者的选择
三者在执行速度方面的比较:StringBuilder > StringBuffer > String
1.如果要操作少量的数据用 —> String
2.单线程操作字符串缓冲区 下操作大量数据 —> StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 —> StringBuffer