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