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来连接字符串就会解决上述问题。

原文地址:https://www.cnblogs.com/cjh-code/p/11808108.html