欲练神功必先自宫,String 自宫后“不可变性”到底有啥好处?
點擊上方“業余草”,選擇“置頂公眾號”
第一時間獲取技術干貨和業界資訊!
?
?
這個標題我想了很久,沒想到太吸引人的標題,于是就拍腦袋決定用這個標題了。大家湊合著看吧!
接上篇文章《String 的“不可變性”是因為 final?請別再錯下去了!》我們再來說說 Java 為什么要讓 String 設計成不可變的?
任何事情都得有原因吧,Java 設計 String 也不是拍腦袋干的。而是經過精密設計和思考得來的。
為了搞清這個問題,我們先來看一個例子。
這個例子,我們的本意是,a ?= b = c = “test”,最終輸出的結果期望是:testA、testB、testC。我們的本意是希望變量是不變的。
好了,現在的輸出結果超出預期。全亂了,不可控了。所以 String 不可變的安全性就體現在這里。實際上 StringBuffer 的作用就是起到了 String 的可變配套類角色。這個例子,我們的本意是,a ?= b = c = “test”,最終輸出的結果期望是:testA、testB、testC。我們的本意是希望變量是不變的。
這只是一個非常簡單的場景,其它的還有 HashSet、HashMap、多線程場景,那就更亂了,更不可控了,更不安全了。
想象一下,如果你的 HashSet 搞成上面這樣的,會出現什么后果?
真要設計成這樣,Java 都要完全被你顛覆。
不可變性在線程安全方面的作用,我就不說了。我們再來看另外一個點:字符串常量池。
假設現在有下面兩個變量:
那么它們在內存中,就是這樣的:
這樣在大量使用字符串的情況下,可以節省內存空間,提高效率。如果要是可變的,完了,變量 one 和 two 得一個人占一點內存。那誰用 Java 誰倒霉,這么浪費內存的誰還會用?Java 將不再是 java。
所以,要想節約一些內存。String 的不可變性就是一個最基本的必要條件。
參考資料
- Java 為什么要讓 String 設計成不可變的?
- Java 中 String 為什么設計成 final 類?為什么它有“不可變性”?
10T技術資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,GO等等。在公眾號內回復對應關鍵字或框架名字,即可免費獲取!!
?你再主動一點點???我們就有故事了
總結
以上是生活随笔為你收集整理的欲练神功必先自宫,String 自宫后“不可变性”到底有啥好处?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python判断回文数_python如何
- 下一篇: 正则表达式 re sys os