String、StringBuffer和StringBuilder的区别

String通常定义一个变量,而StringBuilder和StringBuffer则通常用来字符串的拼接操作。


一、String

  

  String的底层代码为一个final修饰的char数组,也就是说一旦定义String类型的变量之后,便不可再次修改。


 二、StringBuilder与StringBuffer

  

  

  StringBuilder和StringBuffer都继承自AbstrackStringBuilder,这个类的char数组并没有被final修饰,内容是可变的。        
    例如:String s1= "a";
                       String s2= new String("b");
                       String s3=s1+s2;
        如果按这种来计算,得出的“ab”字符串是不可更改的,因为String底层使用的是final修饰的变量,所以会创建三个对象,都会占用内存,并且这三个对象一直都没有失去引用,所以jvm也无法回收他们,造成了资源的大量浪费。而通过AbstrackStringBuilder类可以看到StringBuilder和StringBuffer是在拼接字符串时,先通过判断字符串长度是否足够,从而创建一个新的数组来进行封装。而原来的对象失去引用后,就可以等待垃圾回收。

 三、效率问题
         
  通过底层代码可以看到StringBuffer在进行字符串拼接是使用了同步锁,安全性能提高,而StringBuilder未使用同步锁,故效率提高。

 四、总结 
    1、如果要操作少量的数据用String
    2、多线程操作字符串缓冲区下操作大量的数据使用StringBuffer(线程安全)
    3、单线程操作字符串缓冲区下操作大量的数据使用StringBuilder(线程不安全)
posted @ 2019-04-04 16:38  请假去看丈母娘  阅读(173)  评论(0编辑  收藏  举报