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,因为线程安全。

  • 相关阅读:
    垂死挣扎-3
    垂死挣扎-2
    垂死挣扎-1
    【互联网考试系列-1】进程与线程
    【iOS基础学习随笔-2】SQLite的使用
    【iOS面试系列-2】多线程中同步、异步和串行、并行之间的逻辑关系(必考,必须掌握)
    docker
    给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
    621. 任务调度器
    204. 计数质数
  • 原文地址:https://www.cnblogs.com/jiyukai/p/6860324.html
Copyright © 2011-2022 走看看