String , StringBuffer , StringBuilder 的差别

it2023-06-28  70

String vs StringBuffer vs StringBuilder

StringStringBufferStringBuilder

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。

最新回复(0)