String為什么是不可變的?StringBuffer和StringBuilder的區別是什么?


String s = "hello ";

s += "world";

這兩行代碼執行后,原始的String對象中的內容沒有變,在這段代碼中,s原先指向一個String對象,內容是hello,然后執行+操作,這時,s不指向原來那個對象了,而指向了另一個String對象,內容為hello world,原來那個對象還存在於內存之中,只是s這個引用變量不再指向它了,而用關鍵字new調用構造器,總是會創建一個新的對象,無論內容是否相同。

可變性

簡單來說,String類中使用final關鍵字修飾字符數組來保存字符串,所以String對象是不可變的。而StringBuffer和StringBuilder都繼承了AbstractStringBuilder類,在AbstractStringBuilder中沒有使用final關鍵字修飾,所以這兩種對象都是可變的。

線程安全性

String中的對象是不可變的,也就可以理解為常量,線程安全。StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。StringBuilder並沒有對方法進行加同步鎖,所以是非線程安全的。

性能

每次對String對象進行改變的時候,都會生成一個新的String對象,然后將指針指向新的String對象。StringBuffer每次都會對StringBuffer對象本身進行操作,而不是生成新的對象並改變對象引用。相同情況下使用StringBuilder相比使用StringBuffer僅能提升10%-15%左右的性能提升,但卻要冒多線程不安全的風險。

總結:

1、操作少量的數據,使用String

2、單線程操作字符串緩沖區下操作大量數據,使用StringBuilder

3、多線程操作字符串緩沖區下操作大量數據,使用StringBuffer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM