专栏首页我是攻城师Java开发者如何正确的使用String,StringBuffer,StringBuilder类

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

通过前面的文章,我们知道String类最大的特点是不可变性,这意味着对String类的任何修改都会新生成一个字符串,比如你执行了String类的substring,replace,toUpperCase,toLowerCase,trim方法都会生成一个新的字符串,一旦你的程序对字符串有大量修改,那么在jvm的堆内存中就会生成大量的旧的临时垃圾字符串对象,如何解决这一问题呢?

答案是使用StringBuffer或者StringBuilder类,其中StringBuffer是一个旧类,而StringBuilder是在JDK5中新增的一个类。

这里面就涉及一个比较常见的话题,也是java开发者论坛被提问最多的一个问题,在Java里面String,StringBuffer,StringBuilder的区别和联系。

在回答这个问题之前,我们先来看一些String类的基本特点:

(1)string是不可变的,带来的好处主要有两点,第一是线程安全,可以在多个线程中共享而不需要加锁,第二是由于不变性所以它的hashcode可以被缓存后提升效率,这也是为什么我们见到的大多数的HashMap的key都是使用String类型的。

(2)通过双引号定义的字符串我们称为字符串字面量,这部分字符串会被在string pool中创建,在java里面比较一个对象相等,应该优先选择equals方法而不是==方法

(3)对于字符串拼接的 + 号,底层其实是使用StringBuffer 或者 StringBuilder来完成的。

看下面一个案例:

String s1="a";
        String s2="b";

        String s3=s1+s2; // internal use StringBuffer orStringBuilder  create new String Object
        String s4="ab";

        System.out.println(s3==s4);//false

但如果使用final修饰后,jvm层面会直接优化成一个字符串字面量,这一点需要特别注意,所以下面代码的结果会返回true:

final String s1="a";
        final String s2="b";

        String s3=s1+s2; 
        String s4="ab";

        System.out.println(s3==s4);//true

(4)通过toString方法,可以把StringBuffer,StringBuilder转成String,通过构造方法可以把String转成StringBuffer,StringBuilder,但不能通过强制转换来操作这三个类,即使他们处于同一类继承层次下,否则会抛出java.lang.ClasscastException异常。

关于StringBuffer,StringBuilder的区别非常简单,大家仅仅需要记住StringBuffer是线程安全和同步的而StringBuilder则不是线程安全和非同步的即可,同时因为StringBuffer是线程线程安全的,所以它的性能低于StringBuilder类的。

结论:

String类是不可变的,但是StringBuffer,StringBuilder是可变的。StringBuffer是同步的,所以它的性能低于StringBuilder。连接操作符 + 号,底层是使用StringBuffer或者StringBuilder实现的。

那么在日常开发中,应该如何选择一个合适的字符串操作类呢?

如果了解上面的内容,其实就很容易回答了:

(1)如果你要求字符串不可变,那么应该选择String类

(2)如果你需要字符串可变并且是线程安全的,那么你应该选择StringBuffer类

(3)如果你要求字符串可变并且不存在线程安全问题,那么你应该选择StringBuilder类

本文分享自微信公众号 - 我是攻城师(woshigcs),作者:woshigcs

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

原始发表时间:2018-05-28

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于Java里面的字符串拼接,你了解多少?

    字符串拼接是我们日常开发中很常见的操作,虽然常见,但要是使用不当的的话,很有可能让你的程序处理效率降低一大半,所以我们有必要来重新了解一下Java里面的字符串操...

    我是攻城师
  • Java基础类String了解一下

    当你路过一些商场或者地铁口的时候,有没有被千篇一律的"xx健身,了解一下" 所烦到。

    我是攻城师
  • Java基础类String了解一下

    当你路过一些商场或者地铁口的时候,有没有被千篇一律的"xx健身,了解一下" 所烦到。

    我是攻城师
  • String、StringBuffer与StringBuilder之间区别

    最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下。

    DencyCheng
  • String Stringbuilder Stringbuffer异同

    字符串在编程中使用的非常频繁,同时又是面试中的常见题型,那么我们的对字符串相关类String,StringBuilder,StringBuffer的理解真的正确...

    呼延十
  • 面试题系列第8篇:谈谈String、StringBuffer、StringBuilder的区别?

    关于字符串的面试题除了内存分布、equals比较,最常见的就是与StringBuffer和StringBuilder之间的区别了。

    用户1161110
  • Java性能优化之字符串优化处理

      String对象是Java中重要的数据类型,在大部分情况下我们都会用到String对象。其实在Java语言中,其设计者也对String做了大量的优化工作,这...

    Java后端技术
  • Java源码系列(4):String,StringBuilder,StringBuffer区别

    既然上班了,那就知识学起来,今天咱说一下String,StringBuffer和StringBuilder的区别,这是面试必问,但是如果是工作了的小哥...

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

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

    赵哥窟
  • Java性能优化之字符串优化处理

    String对象是java中重要的数据类型,在大部分情况下我们都会用到String对象。其实在Java语言中,其设计者也对String做了大量的优化工作,这些也...

    Java后端技术

扫码关注云+社区

领取腾讯云代金券