為什么String要設(shè)計(jì)成不可變的?

1. 字符串常量池的需要

字符串常量池(String pool,String intern pool, String保留池) 是Java堆內(nèi)存中一個(gè)特殊的存儲(chǔ)區(qū)域, 當(dāng)創(chuàng)建一個(gè)String對(duì)象時(shí),假如此字符串值已經(jīng)存在于常量池中,則不會(huì)創(chuàng)建一個(gè)新的對(duì)象,而是引用已經(jīng)存在的對(duì)象蝗岖。

如下面的代碼所示,將會(huì)在堆內(nèi)存中只創(chuàng)建一個(gè)實(shí)際String對(duì)象.

String?s1?=?"abcd";??

String?s2?="abcd";??

示意圖如下所示:

圖1

假若字符串對(duì)象允許改變,那么將會(huì)導(dǎo)致各種邏輯錯(cuò)誤,比如改變一個(gè)對(duì)象會(huì)影響到另一個(gè)獨(dú)立對(duì)象. 嚴(yán)格來說鬼悠,這種常量池的思想,是一種優(yōu)化手段.

請(qǐng)思考: 假若代碼如下所示,s1和s2還會(huì)指向同一個(gè)實(shí)際的String對(duì)象嗎?

String?s1=?"ab"?+?"cd";??

String?s2="abc"?+?"d";??

也許這個(gè)問題違反新手的直覺, 但是考慮到現(xiàn)代編譯器會(huì)進(jìn)行常規(guī)的優(yōu)化, 所以他們都會(huì)指向常量池中的同一個(gè)對(duì)象. 或者,你可以用?jd-gui?之類的工具查看一下編譯后的class文件.

2. 允許String對(duì)象緩存HashCode

Java中String對(duì)象的哈希碼被頻繁地使用, 比如在hashMap 等容器中沃疮。

字符串不變性保證了hash碼的唯一性,因此可以放心地進(jìn)行緩存.這也是一種性能優(yōu)化手段,意味著不必每次都去計(jì)算新的哈希碼. 在String類的定義中有如下代碼:

private?int?hash;//用來緩存HashCode??

3. 安全性

String被許多的Java類(庫)用來當(dāng)做參數(shù),例如 網(wǎng)絡(luò)連接地址URL,文件路徑path,還有反射機(jī)制所需要的String參數(shù)等, 假若String不是固定不變的,將會(huì)引起各種安全隱患薇溃。

假如有如下的代碼:

boolean?connect(string?s){??

if?(!isSecure(s))?{???

throw?new?SecurityException();???

}??

//?如果在其他地方可以修改String,那么此處就會(huì)引起各種預(yù)料不到的問題/錯(cuò)誤???

????causeProblem(s);??

}??

總體來說, String不可變的原因包括 設(shè)計(jì)考慮,效率優(yōu)化問題,以及安全性這三大方面. 事實(shí)上,這也是Java面試中的許多 "為什么" 的答案菌赖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沐序,隨后出現(xiàn)的幾起案子琉用,更是在濱河造成了極大的恐慌,老刑警劉巖策幼,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邑时,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡特姐,警方通過查閱死者的電腦和手機(jī)晶丘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來到逊,“玉大人铣口,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵棺榔,是天一觀的道長(zhǎng)继低。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么搭幻? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任姆吭,我火速辦了婚禮已艰,結(jié)果婚禮上痊末,老公的妹妹穿的比我還像新娘。我一直安慰自己哩掺,他們只是感情好凿叠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚼吞,像睡著了一般盒件。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舱禽,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天炒刁,我揣著相機(jī)與錄音,去河邊找鬼誊稚。 笑死翔始,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的里伯。 我是一名探鬼主播城瞎,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疾瓮!你這毒婦竟也來了全谤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤爷贫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后补憾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漫萄,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年盈匾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腾务。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡削饵,死狀恐怖岩瘦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窿撬,我是刑警寧澤启昧,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站劈伴,受9級(jí)特大地震影響密末,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一严里、第九天 我趴在偏房一處隱蔽的房頂上張望新啼。 院中可真熱鬧,春花似錦刹碾、人聲如沸燥撞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽物舒。三九已至,卻和暖如春瞬矩,著一層夾襖步出監(jiān)牢的瞬間茶鉴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工景用, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涵叮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓伞插,卻偏偏與公主長(zhǎng)得像割粮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子媚污,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容