【小知识探究系列二】String、StringBuffer、StringBuilder探究

技术类电子书大放送:电子书

一、String

String属于字符串常量,每次+=操作时其实都会创建一个新对象返回,原对象不会发生任何改变,因此在大量字符串拼接的场景中使用String类型会导致对象爆炸。

字符串不可变的优点:便于字符串共享

字符串存储在公共的常量池中,当将某个字符串数据copy一份时,由于是不可变的,即该块内存地址中的数据是不会发生改变的,那么基于不可变性我们不需要再新申请一份地址存储相同的数据,我们只需要要将引用变量指向原来的那块内存地址即可。试想如果String是可变的,那么我们拷贝多份某个字符串后,由于他们均共享同一块内存,那么通过其中某一个变量的地址对数据进行了修改,那么其他的变量在浑然不知的情况下也发生了变化,那么这种场景肯定是需要避免的。

总而言之,Java的设计者认为共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率。[引自:Java核心技术 卷1]

二、StringBuilder

StringBuilder属于字符串变量,非线程安全,在大量字符串场景下并且不要求线程安全时可以使用StringBuilder。从append源码我们可以看出每次字符串拼接返回的均是this.

@Override
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

三、StringBuffer

StringBuffer也属于字符串变量,其实对StringBuilder的封装,唯一不同的是StringBuffer的所有方法上加了synchronized关键字来保证线程安全。append源码举例如下:

@Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪舟子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值