String StringBuffer和StringBuilder

  • A+
所属分类:Java

String StringBuffer和StringBuilder

String StringBuffer和StringBuilder的区别

String是字符串常量,由String创建的字符内容是不可改变的。而StringBuffer和StringBuilder是字符串变量,StringBuffer和StringBuidler创建的字符内容是可以改变的。

StringBuffer是线程安全的,而StringBuilder是非线程安全的。StringBuilder支持StringBuffer的所有操作,但是因为它不执行同步,不会有线程安全带来额外的系统消耗,所以速度更快。

String 不可变,因此是线程安全的。

String为什么不可变?StringBuffer和StringBuilder为什么可变?

虽然String、StringBuffer和StringBuilder都是final类,它们生成的对象都是不可变的,而且它们内部也都是靠char数组实现的,但是不同之处在于,String类中定义的char数组是final的,而StringBuffer和StringBuilder都是继承自AbstractStringBuilder类,它们的内部实现都是靠这个父类完成的,而这个父类中定义的char数组只是一个普通是私有变量,可以用append追加。因为AbstractStringBuilder实现了Appendable接口。

String不可变的好处

  1. 可以缓存Hash值

因为 String 的 hash 值经常被使用。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算,大大提高效率。

2. String pool的需要

一个 String 对象已经被创建过了,那么就会从 String Pool 中取得该对象的引用。只有 String 是不可变的,才可能使用 String Pool。

字符串常量池(String pool, String intern pool, String保留池) 是Java堆内存中一个特殊的存储区域

3. 安全性

String 经常作为参数,String 不可变,就保证了安全性。

4. 线程安全

String 不可变性天然就具备线程安全特征。

 

 

参考

https://juejin.im/post/5a5d5c66f265da3e261bf46c

LTXU

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: