你真的瞭解String與StringBuffer的區別嗎

String與StringBuffer的區別
  首先,這兩個類都是和字符串有關的。從它們最直接的區別來看,就是對它們創建的時候不一樣。String這個類可以用等號直接來賦值,而StringBuffer不行,它只能用調用new構造方法纔行,當然,String這個類也可以調用new構造方法來創建。如圖

在這裏插入圖片描述

.
  從本質來說,String這個類是不可變的,但是StringBuffer這個類可以直接去修改。
  比如我初始化str1爲"abc",它就不能被改變,而replace改變後的"Abc"是一個新的對象,只不過這個時候沒有對象去引用而已。如果這個創建一個新的字符串去保存的話,就比如我用str5去保存,就可以輸出改之後的了。而StringBuffer類的可以直接改變,如圖
在這裏插入圖片描述
  StringBuffer的在進行字符串處理時,不生成新的對象,在內存使用上要優於String類。所以在實際使用時,如果經常需要對一個字符串進行修改,例如插入,刪除等操作,使用StringBuffer要更加適合一些。
  例如,String串可以直接+ 來追加,StringBuffer可以用.append()來追加。但是它們的效率是大大不同的,這裏我寫的測試就可以看出:同樣的追加10000次,String類用了122ms,而StringBuffer類只用了1ms!這是因爲String類追加的時候是先將串轉換爲StringBuffer再處理的,所以顯示慢的多,效率比較低。

在這裏插入圖片描述

那麼說到這裏,難道String類就沒有任何優點了嗎?
  當然不是!
  在String類中沒有用來改變已有字符串中的某個字符的方法,由於不能改變一個java字符串中的某個單獨字符,所以在JDK文檔中稱String類的對象是不可改變的。然而,不可改變的字符串具有一個很大的優點:編譯器可以把字符串設爲共享的。
  而StringBuffer是線程安全的,在多線程程序中也可以很方便的進行使用,但是程序的執行效率相對來說就要稍微慢一些。

在這結尾處,我將在IDEA環境下通過debug來觀察String與StringBuffer的對象的地址:
  首先生成串的時候,我們可以看到str1與str2均是在同一個地址@801(涉及到堆和常量池這裏不做祥解),str4位於地址@803,如圖
在這裏插入圖片描述
在單步運行到改變str1的值的時候,可以發現,str1所指向的地址的內容仍是"abc",而改變後的串"Abc"存儲在@809,也就是說,String類不可改變。如圖
在這裏插入圖片描述
在單步運行到改變str4的值的時候,可以發現,str4所指向的地址的內容已經發生改變,變爲了"Qwe",也就是說,StringBuffer類可以改變。如圖

在這裏插入圖片描述

由於我也是初學者,所以這裏解釋的可能會有紕漏,歡迎大神指出!
感謝師傅來訪,技術不精,請勿吐槽,如有問題請留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章