主要從三個方面談這三個類的區(qū)別:
- 可變性
- 線程安全性
- 性能
可變性
String為什么是不可變的?
String內(nèi)部實現(xiàn)其實是private final char value[], 所以String對象是不可變的.
StringBuilder與StringBuffer都繼承自AbstractStringBuilder類.
AbstractStringBuilder是用char[] value來存儲字符串的, 但是沒有用final關(guān)鍵字, 所以StringBuilder和StringBuffer對象都是可變的.
線程安全性
String中的對象是不可變的, 可以理解成常量, 是線程安全的.
AbstractStringBuilder是StringBuilder和StringBuffer的公共父類, 定義了一些字符串的操作方法, 如常用的append用于字符串拼接, indexOf用于字符串查找等.
StringBuffer對方法加了同步鎖或者對調(diào)用的方法加了同步鎖, 所以是線程安全的.
而StringBuilder并沒有對方法家同步鎖, 所以是非線程安全的.
性能
對于String對象而言, 每次都會生成一個新的String對象, 然后將指針指向新的String對象.
StringBuffer和StringBuilder每次都會對對象本身進行操作, 而不是生成新的對象并且改變對象的引用. 相同情況下使用StringBuilder會比StringBuffer獲得10%-15%的性能提升, 但是要承擔多線程不安全的風險.
總結(jié)
少量數(shù)據(jù)用String
單線程大量數(shù)據(jù)用StringBuilder
多線程大量數(shù)據(jù)用StringBuffer