從以下三點(diǎn)來(lái)分析:
1、可變性
String類中使用final關(guān)鍵字字符數(shù)組保存字符串,private final char value[],所以String對(duì)象是不可變的。而StringBuffer和StringBuilder都繼承自AbstractStringBuilder類,也是使用字符數(shù)組保存字符串,但是沒(méi)有使用final修飾,所以這兩種對(duì)象都是可變的。
2、線程安全性
String中的對(duì)象是不可變的,也就可以理解為常量,線程安全。StringBuffer對(duì)方法加了同步鎖或者對(duì)調(diào)用的方法加了同步鎖,所以線程是安全的。StringBuilder并沒(méi)有對(duì)方法進(jìn)行加同步鎖,所以非線程安全。
3、性能
每次對(duì)String類型進(jìn)行改變的時(shí)候,都會(huì)生成一個(gè)新的String對(duì)象,然后將指針指向新的String對(duì)象。
StringBuffer和String每次都會(huì)對(duì)StringBuffer對(duì)象本身進(jìn)行操作,而不是生成新的對(duì)象并改變對(duì)象引用。相同情況下使用StringBuilder相比使用StringBuffer僅能獲得10%-15%左右的性能提升,卻要冒著多線程不安全的風(fēng)險(xiǎn)。
總結(jié):
1、操作少量數(shù)據(jù)使用String
2、單線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù):StringBuilder
3、多線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù):StringBuffer