浅谈String、StringBuffer、StringBuilder的区别

大家好,我是Morning,在CSDN写文,分享一些Java基础知识,一些自己认为在学习过程中比较重要的东西,致力于帮助初学者入门,希望可以帮助你进步。感兴趣的欢迎关注博主,和博主一起学习Java知识。大家还可以去专栏查看之前的文章,希望未来能和大家共同探讨技术。

今天和大家一起来探讨一个很基础的知识,可能在之前你了解的不是很清晰,希望这篇文章可以帮助到你。
String是Java中很基础的一个引用类型,它封装了对一个字符串对象的创建和一些基本操作。相信大家对这个类有一定的了解,同样Java提供的常用的可以创建、操作字符串对象的类还有俩个,分别为StringBufferStringBuilder,我在这篇文章中就浅谈这三个类的区别。

String类

在这里插入图片描述
在该类的源码中可以看到,这个类被关键字final修饰,这表示String类不可以被继承,也就是说,String类不可以拥有自己的子类。
现在让我们创建一个String对象,并操作它,看看可以发现什么:
在这里插入图片描述

在上图中我们可以看到,在我创建了一个String类对象之后的HashCode值和我操作之后的HashCode值是不同的,这说明该类型的值是不可变的,这就意味着我每一次操作这个字符串对象都会生成一个新的String对象,然后将指针指向这个新的对象,然后就可以用原来声明的变量名来访问操作后的这个字符串对象。
所以,如果需要大量的操作字符串的话,不建议使用String类型,因为它会大量的产生新的对象,GC就会工作,这就会影响性能。

StringBuffer类

在这里插入图片描述
可以看到StringBuffer类也被final关键字修饰,也不可以被继承。
同样的,我们创建一个StringBuffer对象,并操作它,看看它和String有什么不同:
在这里插入图片描述
由此可见,在我创建了一个StringBuffer类对象之后的HashCode值和我操作之后的HashCode值是相同的,这说明该类的值是可变的,每次的操作都是对对象本身操作,所以不会引发像String一样的问题。
所以在需要大量操作字符串的时候,建议使用StringBuffer来创建字符串对象。
然后让我们来看一看StringBuffer类中的append()方法:
在这里插入图片描述
可以看到该方法被synchronized关键字修饰,这表明StringBuffer 是线程安全的

StringBuilder类

在这里插入图片描述
看到这里就可以知道了,这三个常用的字符串类都是被final修饰的,都是不可以被继承的。
又到了上代码的环节:
在这里插入图片描述
由此可见,该类的值也是可变的,其实StringBuilder类是在 Java 5 中被提出,该类与stringBuffer最大的区别在于,StringBuilder中的方法没有被synchronized关键字修饰,不是线程安全的
在这里插入图片描述
但是在大多数情况下,StringBuilder要比StringBuffer要快一些,所以在一些对字符串操作较多,而且是单线程的情况下,建议使用StringBuilder。

总结

  1. String:值不可变,影响性能,在对字符串操作较少、单线程情况下使用
  2. StringBuffer:值可变,线程安全,在对字符串操作较多、多线程情况下使用
  3. StringBuilder:值可变,线程不安全,在对字符串操作较多、单线程情况下使用
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值