• String,StringBuffer和StringBuilder的区别


      面试的时候经常问到的一个题:这里先说明下三者在JVM中的执行速度:StringBuilder > StringBuffer > String,原因且看下面慢慢阐述。

      首先看一个概念,为啥一个是常量,另外两个是变量,详细可见JDK中源码的修饰符。

      String:字符串常量

      StringBuilder:字符串变量

      StringBuffer:字符串变量

      首先看一段简单的代码:这段代码看似简单,实际上很多人不懂JVM执行的原理,首先JVM创建了str的对象,并赋予了"abc"的值,而后再次创建一个新的str的对象,并由原先的str对象拼接上 "d",最终赋值为"abcd",而原先的str的对象则被垃圾回收掉了。看JDK的源码可知,String类的修饰符是final的,所以对象是无法被修改的,因此每次对String对象的切割,拼接等操作,实际上new出了很多对象,所以这样的原因导致了操作String的速度变慢。

    String str = "abc";
    str = str + "d";

      但StringBuilder和StringBuffer不一样,他们是字符串变量,是可变的对象,每次对他们的操作都是在一个对象上操作的,所以速度自然就变快了。

      

      StringBuilder和StringBuffer的比较:

      StringBuilder是线程不安全的,而StringBuffer是线程安全的。何为线程安全?

      线程安全:如果你的程序是一个进程中运行的,而该进程中跑着多个线程,并且可能同时操作该部分相同的程序,若每次运行的结果和单线程执行的结果相同,并且变量值和预       期的结果也是相同的,那么称之为线程安全。

       

      结论

      对三者的使用建议如下:对少量的字符串数据操作使用String

                 单线程场景下操作大量的字符串数据使用StringBuilder,因为速度最快。

                   多线程场景下操作大量的字符串数据使用StringBuffer,因为线程安全。

  • 相关阅读:
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
    牛客网每日一练
  • 原文地址:https://www.cnblogs.com/jiyukai/p/6860324.html
Copyright © 2020-2023  润新知