String 是个final class不可变字符串,拼接性能低,频繁操作,性能影响
StringBuffer 解决大量字符串拼接,线程安全
StringBuilder 在StringBuffer基础上加个线程不安全,效率最高,优先考虑
StringBuffer:线程安全
StringBuilder:线程不安全
一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。
操作少量的数据使用 String。
单线程操作大量数据使用 StringBuilder。
多线程操作大量数据使用 StringBuffer。
1.String 不可变,所以用到字符串常量池,String s1 = 'abc'; 和 String s2 = 'abc'; 指向同一个常量池,效率更高
2.多线程安全
3.String的hashCode被缓存起来,用于HashMap这种计算hashCode的速度更快
相对StringBuffer,StringBuilder没有在方法上使用 synchronized 关键字
简单说String的内部char数组是final 的,另外两个不是final的。
虽然String、StringBuffer和StringBuilder都是final类,它们生成的对象都是不可变的,而且它们内部也都是靠char数组实现的,但是不同之处在于,String类中定义的char数组是final的,而StringBuffer和StringBuilder都是继承自AbstractStringBuilder类,它们的内部实现都是靠这个父类完成的,而这个父类中定义的char数组只是一个普通是私有变量,可以用append追加。因为AbstractStringBuilder实现了Appendable接口。
参考资料
https://juejin.cn/post/6844903550988845063
http://c.biancheng.net/view/5822.html