為什么String要設計成不可變的?

1. 字符串常量池的需要

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

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

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

String?s2?="abcd";??

示意圖如下所示:

圖1

假若字符串對象允許改變,那么將會導致各種邏輯錯誤,比如改變一個對象會影響到另一個獨立對象. 嚴格來說率拒,這種常量池的思想,是一種優(yōu)化手段.

思考: 假若代碼如下所示,s1和s2還會指向同一個實際的String對象嗎?

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

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

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

2. 允許String對象緩存HashCode

Java中String對象的哈希碼被頻繁地使用, 比如在hashMap 等容器中帝蒿。

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

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

3. 安全性

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

假如有如下的代碼:

boolean?connect(string?s){??

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

throw?new?SecurityException();???

}??

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

????causeProblem(s);??

}??

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末句各,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顷歌,更是在濱河造成了極大的恐慌,老刑警劉巖幔睬,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眯漩,死亡現(xiàn)場離奇詭異,居然都是意外死亡麻顶,警方通過查閱死者的電腦和手機赦抖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辅肾,“玉大人队萤,你說我怎么就攤上這事〗玫觯” “怎么了要尔?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵舍杜,是天一觀的道長。 經(jīng)常有香客問我赵辕,道長既绩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任还惠,我火速辦了婚禮饲握,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚕键。我一直安慰自己救欧,他們只是感情好,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布锣光。 她就那樣靜靜地躺著笆怠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪誊爹。 梳的紋絲不亂的頭發(fā)上骑疆,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天,我揣著相機與錄音替废,去河邊找鬼。 笑死泊柬,一個胖子當著我的面吹牛椎镣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兽赁,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼状答,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刀崖?” 一聲冷哼從身側(cè)響起惊科,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亮钦,沒想到半個月后馆截,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蜂莉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年蜡娶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片映穗。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡窖张,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚁滋,到底是詐尸還是另有隱情宿接,我是刑警寧澤赘淮,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站睦霎,受9級特大地震影響梢卸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碎赢,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一低剔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肮塞,春花似錦襟齿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拷窜,卻和暖如春开皿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篮昧。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工赋荆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懊昨。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓窄潭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酵颁。 傳聞我的和親對象是個殘疾皇子嫉你,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348