你真的了解String与StringBuffer的区别吗

String与StringBuffer的区别
  首先,这两个类都是和字符串有关的。从它们最直接的区别来看,就是对它们创建的时候不一样。String这个类可以用等号直接来赋值,而StringBuffer不行,它只能用调用new构造方法才行,当然,String这个类也可以调用new构造方法来创建。如图

在这里插入图片描述

.
  从本质来说,String这个类是不可变的,但是StringBuffer这个类可以直接去修改。
  比如我初始化str1为"abc",它就不能被改变,而replace改变后的"Abc"是一个新的对象,只不过这个时候没有对象去引用而已。如果这个创建一个新的字符串去保存的话,就比如我用str5去保存,就可以输出改之后的了。而StringBuffer类的可以直接改变,如图
在这里插入图片描述
  StringBuffer的在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入,删除等操作,使用StringBuffer要更加适合一些。
  例如,String串可以直接+ 来追加,StringBuffer可以用.append()来追加。但是它们的效率是大大不同的,这里我写的测试就可以看出:同样的追加10000次,String类用了122ms,而StringBuffer类只用了1ms!这是因为String类追加的时候是先将串转换为StringBuffer再处理的,所以显示慢的多,效率比较低。

在这里插入图片描述

那么说到这里,难道String类就没有任何优点了吗?
  当然不是!
  在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的。
  而StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

在这结尾处,我将在IDEA环境下通过debug来观察String与StringBuffer的对象的地址:
  首先生成串的时候,我们可以看到str1与str2均是在同一个地址@801(涉及到堆和常量池这里不做祥解),str4位于地址@803,如图
在这里插入图片描述
在单步运行到改变str1的值的时候,可以发现,str1所指向的地址的内容仍是"abc",而改变后的串"Abc"存储在@809,也就是说,String类不可改变。如图
在这里插入图片描述
在单步运行到改变str4的值的时候,可以发现,str4所指向的地址的内容已经发生改变,变为了"Qwe",也就是说,StringBuffer类可以改变。如图

在这里插入图片描述

由于我也是初学者,所以这里解释的可能会有纰漏,欢迎大神指出!
感谢师傅来访,技术不精,请勿吐槽,如有问题请留言。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值