String vs StringBuffer vs StringBuilder
String
//String类部分码源
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence,
Constable, ConstantDesc {
@Stable
private final byte[] value;
一、String源码中有一个byte[] 数组,我们知道数组一旦创建,长度和类型无法改变。
二、这个数组是final修饰的。说明”引用“指向数组的“引用地址”是不能改变的。被修饰的引用一旦指向某个对象,就不能指向其他对象。所以String是不可变的。
缺点:String类,每次操作都会生产新的String对象,效率低下,浪费大量内存。
而涉及到字符串拼接,一般使用StringBuffer和StringBuilder。
StringBuffer
底层采用数组byte[] ,没有被final修饰,可以指向其他地方。无参构造默认容量16.
append被synchronized修饰,说明该方法是多线程安全的。
StringBuffer扩容方式:当实际容量大于当前数组容量,容量*2+2 .
StringBuilder
在StringBuilder中,默认初始化容量为16,底层是数组byte[],没有被final修饰,可以指向其他对象。
StringBuilder的扩容方式。当实际容量大于当前数组容量时,容量*2+2 。
ensureCapacityInternal 这个方法进行是否扩容的判断
需要扩容就调用newCapacity方法进行扩容
StringBuilder 和 StringBuffer的差异:
StringBuilder是1.5新引入的,其前身就是StringBuffer。StringBuilder 和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
String和StringBuffer的效率问题:
由于 StringBuilder 相较于 StringBuffer 有速度优势(没有线程安全问题),所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
JVM运行程序主要的时间耗费是在创建对象和回收对象上。
小结:
(1)如果要操作少量的数据用 String;
(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。