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是在拼接字符串时,先通过判断字符串长度是否足够,从而创建一个新的数组来进行封装。而原来的对象失去引用后,就可以等待垃圾回收。
三、效率问题
![](https://img2018.cnblogs.com/blog/1652975/201904/1652975-20190404163548234-1821028495.png)
![](https://img2018.cnblogs.com/blog/1652975/201904/1652975-20190404163619214-1938917365.png)
通过底层代码可以看到StringBuffer在进行字符串拼接是使用了同步锁,安全性能提高,而StringBuilder未使用同步锁,故效率提高。
四、总结
1、如果要操作少量的数据用String
2、多线程操作字符串缓冲区下操作大量的数据使用StringBuffer(线程安全)
3、单线程操作字符串缓冲区下操作大量的数据使用StringBuilder(线程不安全)