String , StringBuffer , StringBuilder 的差别

String在Java中是不可变的,每次操作都会创建新对象,效率低且浪费内存。StringBuffer和StringBuilder用于字符串拼接,其中StringBuffer是线程安全的,适合多线程环境,而StringBuilder在单线程环境下性能更优。它们的扩容策略类似,当实际容量超过当前容量时,容量会扩大到原容量的两倍加2。因此,根据线程需求选择使用StringBuffer或StringBuilder。
摘要由CSDN通过智能技术生成

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值