浅析String、StringBuilder、StringBuffer区别

String对象是不可变的。查看jdk文档你会发现,String类中每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,并包含修改后的内容。而最初的String对象没有改变。

public class TestString {
    public static void main(String[] args) {
        String str = "aaaa>";
        str += "bbbb>"+"cccc>";
        System.out.println(str);
    }
}

String对象具有只读特性,所以指向它的任何引用都不可能改变它的值,也就不会对其他的引用有什么影响。

String的不可变性就带来了效率问题,以上代码是这样工作的:String对象在拼接字符串的时候会调用StringBuilder的append()方法,生成新的String对象,以包含"bbbb>"和str连接后的字符串,然后该对象再与"cccc>"相连生成一个新的String对象,以此类推。

通过查看String源码也能看到结果


也可以通过jdk自带的工具javap来反编译以上代码,命令如下:

javac TestString.java

javap -c TestString.class



  编译器自动引入了StringBuilder类,虽然我们代码中并没有使用它,但是编译器去主动使用了,因为它更加高效。在这个例子中最终会生成3个String对象。


总结:

1.String是不可变对象,每连接一个字符串就会多生成一个对象。

2.StringBuilder是可变的字符串操作类,效率最高,但不是线程安全的

3.StringBuffer是java SE5引入的可变的字符串操作类,是线程安全的,开销就会大,效率不如StringBuilder


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

索码理

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

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

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

打赏作者

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

抵扣说明:

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

余额充值