(1)請你說明String 和StringBuffer,StringBuilder的區別


(1):String 是對象不是原始類型,是不可變對象,一旦創建,就不能修改它的值,對於已經存在的String對象的修改都是重新創建一個String對象,把新的值保存進去;String是final類,不能被繼承。

這里補充下原始類型:char,boolean,byte,short,int,long,float,double對應其包裝類型:首字母大寫:Character,Boolean,Byte,Short,Integer,Long,Float,Double

(2):StringBuffer 是可以修改的對象,修改它的時候不會像創建String對象一樣重新創建賦值,它只能通過構造函數創建,在創建后會在內存中分配空間,初始化會保存一個null,當向StringBuffer賦值的時候可以通過它的append方法。它的本質是一個線程安全的可修改的字符序列,把所有修改數據的方法都加上synchronized。但是保證了線程安全是需要性能的代價。

(3):在操作字符串連接中StringBufer效率要比String要高:

String str = new String("hello,word");

str + = "xiaoming";

上面的處理其實是先通過建立一個StringBuffer 通過append方法,最后 .toString(); 通過對比知道String的連接操作比StringBuffer多了一些操作,效率會大打折扣。

(4):String對象的創建修改過程每次都會創建新的對象,這樣之前的對象就會被垃圾回收,影響性能。

-------------

(5):StringBuilder JDK1.5發布的,與StringBuffer本質上沒有區別,就是去掉了保證線程安全那部分,減少了開銷。

(6):StringBuffer與StringBuilder都繼承了AbstractStringBuilder,底層都是利用可修改的char數組(JDK9后是byte數組)。

(7):如果有大量字符串需要拼接,如果能預知大小,最好在new StringBuffer,StringBuilder的時候設置capacity,避免多次擴容,擴容要拋棄原有數組拷貝創建新的數組。

總結:少量操作字符串使用String就夠了,如果在程序中需要對字符串頻繁修改連接操作,String在操作字符串的時候new了很多次StringBuffer,建議使用StringBuffer,這樣性能更高,很多情況下我們操作字符串不需要線程安全,可以用StringBuilder,減小開銷。


免責聲明!

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



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