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

    String和StringBuffer、StringBuilder的区别是什么?String为什么不可变

           相同点:三者都可以存储和操作字符串

          不同点:

               可变性:  String类使用final关键字字符数组保存字符串(private final char value[]) 所有String对象是不可变得,而StringBuffe和StringBuilder都使用字符数组保存字符串     (char[] value)但没有用final修饰,所以二者是可变的

       线程安全性:String对象是不可变得,可以认为是常量,线程安全AbstractStringBuilder是StrinBuilder和StringBuffer公共父类,定义了一些字符串的基本操作,           StringBuffer对方法加上了同步锁或者对调用方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的

         性能:每次对String类型进行修改,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对  象并改变对象的引用,相同情况下StringBuilder相比使用StringBuffer仅能获得10%~15%左右的性能提升,但却要冒着多线程不安全的风险

       总结:

        操作少量的数据(String)

        单线程操作字符串缓冲区下操作大量数据(StringBuilder)

        多线程操作字符串缓冲区下操作大量数据(StringBuffer)

    什么情况下用“+”运算符进行字符串连接比调用StringBuffer/String Builder对象的 append 方法连接字符串性能更好?

      Java 编译器将"+"编译成了 StringBuilder

           字符串可以直接使用“+”进行连接,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder,

      “+”和StringBuilder的运行结果是完全等效的,但二者的运行效率和消耗资源方面有很大的区别:

      当连接的字符串表达式比较简单那么二者基本一样,如果字符串比较复杂(使用循环连接字符串)使用“+”消耗资源(每循环一次都会创建一个StringBuilder对象,会占用到量的资  源),直接使用StringBuilder来连接字符串就会解决上述问题。

  • 相关阅读:
    python之__new__方法
    python之类也是一个对象
    python之面向对象中的多态
    python之多继承中的一些问题
    python之子类继承父类时进行初始化的一些问题
    Java深度历险(四)——Java垃圾回收机制与引用类型
    Java深度历险(三)——Java线程​:基本概念、可见性与同步
    Java深度历险(二)——Java类的加载、链接和初始化
    Java深度历险(一)——Java字节代码的操纵
    程序员面试什么最重要?
  • 原文地址:https://www.cnblogs.com/cjh-code/p/11808108.html
Copyright © 2011-2022 走看看