专栏首页陈琛的Redis文章Java源码系列(4):String,StringBuilder,StringBuffer区别

Java源码系列(4):String,StringBuilder,StringBuffer区别

hi,国庆节后第一篇。首先,祝大家国庆快乐。然后祝大家上班快乐。

既然上班了,那就知识学起来,今天咱说一下String,StringBuffer和StringBuilder的区别,这是面试必问,但是如果是工作了的小哥哥和小姐姐,就不会傻白甜的问这个问题,但咱还是要知道的,毕竟要是不会,要被面试的人笑死了,咱丢不起这人呢。

话不多说,先看结论。

1.运行速度方面

1.运行速度从快到慢:StringBuilder>StringBuffer>String

理由是:

01

StringBuilder和StringBuffer拥有的成员属性和成员方法基本相同,区别就是StringBuffer的成员方法前面多了synchronized关键字,保证了线程安全,所以StringBuffer的速度比StringBuilder的速度要慢。

贴图镇楼:

02

String在最后的原因是他是字符串常量,而StringBuilder和StringBuffer都是字符串变量,也就是String一旦创建之后该对象是不可更改的,但是其他的两个是变量,是可以更改的。

看代码 :

他们两种方法输出的结构是一样的,那我们先看一下变量str在25行,27行的地址是否相同,代码运行过程如下:

我们看出在25行地址是497,在27行地址是499,就说明Java首先创建一个String对象str,并把“abc”赋值给str,然后在27行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

那我们再看一下变量stringBuffer在30行和32行中变量有没有变化,代码运行过程如下:

我们看出在地址并没有发生变化,就说明在这个过程中,stringBuffer的位置并没有变化。

2.线程安全方面

2.StringBuffer是线程安全的,StringBuilder是线程不安全的。

理由是:StringBuffer中方法有synchronized关键字,来保证线程安全性。

本文分享自微信公众号 - 学习Java的小姐姐(huangtest01),作者:学习Java的小姐姐

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java源码系列(4):String[]和List<String>的区别及相互转换

    Hello,everybody。好几天不见啦,原因是我家丽颖结婚了,打击太大,让我缓缓(emmmmmm,我才不会告诉你们是因为我懒)。咱今天说的是String[...

    陈琛
  • UnsupportedOperationException异常

    public class test { public static void main(String[] args) { //定义一个字符长度为5的字符串 ...

    陈琛
  • Redis系列——6.复制功能

    言归正传,今天要说的可是个大家伙,毕竟从现在开始,咱不整简单功能啦,整点厉害的,哈哈哈

    陈琛
  • Java中String、StringBuffer和StringBuilder的区别

    三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。

    赵哥窟
  • java常见面试题之String

    招聘季节分享一些干货,这篇推文分享在面试中遇到的String类的面试题,算是面试中的常客,有问题请指出,谢过...

    爱敲代码的猫
  • 在java中String类为什么要设计成final?

    String很多实用的特性,比如说“不可变性”,是工程师精心设计的艺术品!艺术品易碎!用final就是拒绝继承,防止世界被熊孩子破坏,维护世界和平!

    用户1205080
  • Android开发中常用的工具类

    包括HttpUtils、DownloadManagerPro、ShellUtils、PackageUtils、PreferencesUtils、JSONUtil...

    用户2192970
  • Java开发者如何正确的使用String,StringBuffer,StringBuilder类

    通过前面的文章,我们知道String类最大的特点是不可变性,这意味着对String类的任何修改都会新生成一个字符串,比如你执行了String类的substrin...

    我是攻城师
  • java 记录对象前后修改的内容(工具类)

      RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。

    陈灬大灬海
  • String的内存模型,为什么String被设计成不可变的

    String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢? 前...

    Ryan-Miao

扫码关注云+社区

领取腾讯云代金券