zoukankan      html  css  js  c++  java
  • String、StringBuffer、StringBuilder区别

    1.三个类之间的关系

    StringBuffer和StringBuilder都继承自AbstractStringBuilder这个类,而AbstractStringBuilder和String都继承自Object这个类

    2.String是不可变类,而StringBuffer, StringBuilder是可变类

      我们查看这三个类的源码,String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。源码中 private final char value[]; 因为value被final修饰,所以不可变

    而StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。

    3.性能(执行速度) 上对比

     一般而言在执行速度上,String < StringBuffer < Stringbuilder

    3.1 String < StringBuffer

      这是因为String类是不可变的,即字符串常量,所以每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。这就会对程序运行产生很大的影响,因为当内存中的无引用对象多了以后,JVM的GC进程就会进行垃圾回收,这个过程会耗费很长一段时间,因此经常改变内容的字符串最好不要用 String类的对象。而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。比如

    String s1 = "a";
    
    String s2 = "b";
    
    String s3 = "c";
    
    String string = s1 + s2 + s3;  

    3.2 StringBuffer< StringBuilder

    这时候使用StringBuilder的运行速度更快,但是因为StringBuffer中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而StringBuilder是非线程安全,加锁会降低性能,所以速度上StringBuilder > StringBuffer

    3.3 特殊情况String最快

    但是有些情况string的速度比stringbuilder快,那就是在编译时期产生的优化,比如:

    String s = "a"+"b"+"c";  

     在编译的时候会优化成String  s="abc"; 此时快于StringBuilder的append方式

      

  • 相关阅读:
    QT 界面刷新
    剑指 Offer 65. 不用加减乘除做加法
    3.nvidia-docker安装
    6.通过docker配置深度学习环境
    2.docker安装
    OSG+Visual Studio2015项目变量设置;
    Learning OSG programing---osgwindows
    日常学习网站推荐
    开发 MFC 应用的一般过程
    FVWM使用指南
  • 原文地址:https://www.cnblogs.com/wanghongsen/p/9118556.html
Copyright © 2011-2022 走看看