String / StringBuffer / StringBuilder的区别

String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)

主要区别如下:

1. String是不可变的,而StringBuffer和StringBuilder是可变的

可以在源码中看到,String类是被定义为final的,而StringBuffer和StringBulider不是
举个例子
String a="asd";//假设a指向了0x00001的地址
假如再 a="saf";//假设saf的地址是0x00002
此时,a是指向0x00002地址,而不是0x00001地址
a="saf"相当于新产生了一个String对象,而0x00001的“asd”对象还存在
而如果是用 StringBuilder或者StringBuffer进行上述操作,a还是指向0x00001地址,只是将其上的内容改了,并没有产生新的对象

2. String和StringBuffer是线程安全的,而StringBuilder是非线程安全的

String因为是定义为final的,所以是线程安全的,而StringBuffer加了同步锁,所以也是线程安全的。


3. String是java.lang.String而StringBuffer和StringBuilder都是继承自AbstractStringBuilder(是一个抽象类)

所以StringBuffer和StringBulider拥有共同的方法,比如append


执行速度

这三个类在进行操作时的速度关系为:StringBuilder > StringBuffer > String

由于String中进行操作时都会新建一个char[ ]数组代替原来的char[ ]数组,所以速度最慢

StringBuffer线程安全,每个方法都有synchronized同步阻塞,所以操作速度受影响

StringBuilder没有同步阻塞的限制,所以操作速度最快


使用场景

  • 如果要操作少量的数据用 = String

  • 单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

  • 多线程操作字符串缓冲区 下操作大量数据 = StringBuffer


在大部分情况下 StringBuffer > String
StringBuffer
    Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
    可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
    StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
    例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。

在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilder

    java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。


常用方法

String都比较熟悉,这里只整理StirngBuffer/StringBuilder类的方法,这两个类大多数方法都是继承于AbstractStringBuilder父类

1、append(String str) 追加内容到当前StirngBuffer/StringBuilder对象的末尾,类似于字符串的连接

2、deleteCharAt(int k)删除指定位置的字符,然后将剩余的内容形成新的字符串

3、delete(int start, int end) 删除指定区间以内的所有字符,包含start,不包含end索引的区间

4、insert(int index, String str) 在StirngBuffer/StringBuilder对象指定位置中插入内容str,然后形成新的字符串

5、reverse() 将StirngBuffer/StringBuilde对象中的内容反转,然后形成新的字符串


参考链接:

https://blog.csdn.net/ls5718/article/details/51899027

https://blog.csdn.net/martinmateng/article/details/50808052

https://blog.csdn.net/m0_37241851/article/details/71056290

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值