當前位置:
首頁 > 知識 > 為什麼Java要把字元串設計成不可變的

為什麼Java要把字元串設計成不可變的

來自:HollisChuang s Blog

是Java中一個不可變的類,所以他一旦被實例化就無法被修改。不可變類的實例一旦創建,其成員變數的值就不能被修改。不可變類有很多優勢。本文總結了為什麼字元串被設計成不可變的。將涉及到內存、同步和數據結構相關的知識。

字元串池

字元串池是方法區中的一部分特殊存儲。當一個字元串被被創建的時候,首先會去這個字元串池中查找,如果找到,直接返回對該字元串的引用。

下面的代碼只會在堆中創建一個字元串

下面是圖示:

如果字元串可變的話,當兩個引用指向指向同一個字元串時,對其中一個做修改就會影響另外一個。(請記住該影響,有助於理解後面的內容)

緩存Hashcode

Java中經常會用到字元串的哈希碼(hashcode)。例如,在HashMap中,字元串的不可變能保證其hashcode永遠保持一致,這樣就可以避免一些不必要的麻煩。這也就意味著每次在使用一個字元串的hashcode的時候不用重新計算一次,這樣更加高效。

在String類中,有以下代碼:

以上代碼中變數中就保存了一個String對象的hashcode,因為String類不可變,所以一旦對象被創建,該hash值也無法改變。所以,每次想要使用該對象的hashcode的時候,直接返回即可。

使其他類的使用更加便利

在介紹這個內容之前,先看以下代碼:

在上面的例子中,如果字元串可以被改變,那麼以上用法將有可能違反Set的設計原則,因為Set要求其中的元素不可以重複。上面的代碼只是為了簡單說明該問題,其實String類中並沒有這個欄位值。

安全性

String被廣泛的使用在其他Java類中充當參數。比如網路連接、打開文件等操作。如果字元串可變,那麼類似操作可能導致安全問題。因為某個方法在調用連接操作的時候,他認為會連接到某台機器,但是實際上並沒有(其他引用同一String對象的值修改會導致該連接中的字元串內容被修改)。可變的字元串也可能導致反射的安全問題,因為他的參數也是字元串。

代碼示例:

不可變對象天生就是線程安全的

因為不可變對象不能被改變,所以他們可以自由地在多個線程之間共享。不需要任何同步處理。

總之,被設計成不可變的主要目的是為了安全和高效。所以,使是一個不可變類是一個很好的設計。

本文編號2429,以後想閱讀這篇文章直接輸入2429即可。

輸入m獲取文章目錄

推薦

Java編程

更多推薦:18個技術類微信公眾號

涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序猿 的精彩文章:

幫你節省 50% 開發時間,小程序開發神器免費內測
我去!騰訊「逼加班」套路果然是搞事情!
阿里、網易、滴滴共十次前端面試碰到的問題
勇士奪冠有秘訣!來來來,一起來扒一扒NBA背後的黑科技!
造成代碼難以維護的35個惡習

TAG:程序猿 |

您可能感興趣

iPhone9就該設計成這樣 果粉才不會嫌它丑
如果iPhone11設計成這樣,你還覺得丑嗎?
腦洞真大:如果iPhone X設計成這樣!
有問有答:為什麼電腦cpu不像手機cpu那樣設計成大小核?
一加手機7概念圖:設計成這樣才令iPhoneXS感到害怕
怎樣才能將LOGO設計成「一坨屎」的感覺?
iPhone XI設計成這樣,你會考慮入手嗎?
Supreme x TNF 新聯名可能會設計成這樣?!
vivo NEX手機曝光!這個設計成就了真正全面屏手機
如果iPhoneXI設計成這樣 那華為Mate30又要落後了
為什麼現在的USB口都不設計成圓的了?不是更方便隨意插嗎?
如果把任天堂Labo設計成「大亂斗」里的角色會是什麼樣子?
卧室設計成這樣,怎麼可能會睡不好!
如果iPhone9設計成這樣 那我現在就開始攢錢
包裝設計成這樣 還讓不讓人扔了
把包裝設計成這樣,還讓不讓人扔了?
Michael Kors幹練簡約的設計成為大趨勢,立體輪廓剪裁
鍵盤布局為什麼不按照字母順序排列,非要設計成QWERTY?
LG超薄摺疊手機 原來還可以設計成這樣
Air Force 1 真的被設計成了拖鞋……