zoukankan      html  css  js  c++  java
  • 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,因为线程安全。

  • 相关阅读:
    python中列表,元组,字典常用操作方法的总结
    python中字符串常用方法总结
    tomcat运行报错Failed to start component [StandardEngine[Catalina].StandardHost[localhost].XXXX
    在Linux Ubuntu16.04中如何修改文件名
    【蓝桥杯训练】第五天1369
    【python3】raise,assert,nonlocal 关键字解读
    【python3】yield 关键字解读
    【蓝桥杯训练】第四天1294、1297
    【蓝桥杯训练】第四天1291、1293
    【蓝桥杯训练】第四天1285、1290
  • 原文地址:https://www.cnblogs.com/jiyukai/p/6860324.html
Copyright © 2011-2022 走看看