java基礎(chǔ)知識梳理02-字符串

String 類不可變---基于安全性和效率考慮

String是Java中一個(gè)不可變的類,所以他一旦被實(shí)例化就無法被修改伪阶。不可變類的實(shí)例一旦創(chuàng)建煞檩,其成員變量的值就不能被修改。不可變類有很多優(yōu)勢栅贴。本文總結(jié)了為什么字符串被設(shè)計(jì)成不可變的斟湃。將涉及到內(nèi)存、同步和數(shù)據(jù)結(jié)構(gòu)相關(guān)的知識檐薯。

字符串池

字符串池是方法區(qū)中的一部分特殊存儲凝赛。當(dāng)一個(gè)字符串被被創(chuàng)建的時(shí)候,首先會去這個(gè)字符串池中查找坛缕,如果找到墓猎,直接返回對該字符串的引用。

下面的代碼只會在堆中創(chuàng)建一個(gè)字符串

String string1 = "abcd";

String string2 = "abcd";

下面是圖示:

如果字符串可變的話祷膳,當(dāng)兩個(gè)引用指向指向同一個(gè)字符串時(shí)陶衅,對其中一個(gè)做修改就會影響另外一個(gè)。(請記住該影響直晨,有助于理解后面的內(nèi)容)

緩存Hashcode

Java中經(jīng)常會用到字符串的哈希碼(hashcode)搀军。例如膨俐,在HashMap中,字符串的不可變能保證其hashcode永遠(yuǎn)保持一致罩句,這樣就可以避免一些不必要的麻煩焚刺。這也就意味著每次在使用一個(gè)字符串的hashcode的時(shí)候不用重新計(jì)算一次,這樣更加高效门烂。

在String類中乳愉,有以下代碼:

private int hash;//this is used to cache hash code.

以上代碼中hash變量中就保存了一個(gè)String對象的hashcode,因?yàn)镾tring類不可變屯远,所以一旦對象被創(chuàng)建蔓姚,該hash值也無法改變。所以慨丐,每次想要使用該對象的hashcode的時(shí)候坡脐,直接返回即可。

使其他類的使用更加便利

在介紹這個(gè)內(nèi)容之前房揭,先看以下代碼:

HashSet set = new HashSet();

set.add(new String("a"));

set.add(new String("b"));

set.add(new String("c"));

for(String a: set)

a.value = "a";

在上面的例子中备闲,如果字符串可以被改變,那么以上用法將有可能違反Set的設(shè)計(jì)原則捅暴,因?yàn)镾et要求其中的元素不可以重復(fù)恬砂。上面的代碼只是為了簡單說明該問題,其實(shí)String類中并沒有value這個(gè)字段值蓬痒。

安全性

String被廣泛的使用在其他Java類中充當(dāng)參數(shù)泻骤。比如網(wǎng)絡(luò)連接、打開文件等操作乳幸。如果字符串可變瞪讼,那么類似操作可能導(dǎo)致安全問題。因?yàn)槟硞€(gè)方法在調(diào)用連接操作的時(shí)候粹断,他認(rèn)為會連接到某臺機(jī)器,但是實(shí)際上并沒有(其他引用同一String對象的值修改會導(dǎo)致該連接中的字符串內(nèi)容被修改)嫡霞∑柯瘢可變的字符串也可能導(dǎo)致反射的安全問題,因?yàn)樗膮?shù)也是字符串诊沪。

代碼示例:

boolean connect(string s){

if (!isSecure(s)) {

throw new SecurityException();

}

//如果s在該操作之前被其他的引用所改變养筒,那么就可能導(dǎo)致問題。

causeProblem(s);

}

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

因?yàn)椴豢勺儗ο蟛荒鼙桓淖兌艘Γ运麄兛梢宰杂傻卦诙鄠€(gè)線程之間共享晕粪。不需要任何同步處理。

總之渐裸,String被設(shè)計(jì)成不可變的主要目的是為了安全和高效巫湘。所以装悲,使String是一個(gè)不可變類是一個(gè)很好的設(shè)計(jì)。

參考:http://www.jb51.net/article/117185.htm

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尚氛,一起剝皮案震驚了整個(gè)濱河市诀诊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阅嘶,老刑警劉巖属瓣,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讯柔,居然都是意外死亡抡蛙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門魂迄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溜畅,“玉大人,你說我怎么就攤上這事极祸〈雀瘢” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵遥金,是天一觀的道長浴捆。 經(jīng)常有香客問我,道長稿械,這世上最難降的妖魔是什么选泻? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮美莫,結(jié)果婚禮上页眯,老公的妹妹穿的比我還像新娘。我一直安慰自己厢呵,他們只是感情好窝撵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著襟铭,像睡著了一般碌奉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寒砖,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天赐劣,我揣著相機(jī)與錄音,去河邊找鬼哩都。 笑死魁兼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漠嵌。 我是一名探鬼主播咐汞,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盖呼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碉考?” 一聲冷哼從身側(cè)響起塌计,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侯谁,沒想到半個(gè)月后锌仅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡墙贱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年热芹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惨撇。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伊脓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出魁衙,到底是詐尸還是另有隱情报腔,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布剖淀,位于F島的核電站纯蛾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纵隔。R本人自食惡果不足惜翻诉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捌刮。 院中可真熱鬧碰煌,春花似錦、人聲如沸绅作。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棚蓄。三九已至堕扶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梭依,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工典尾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留役拴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓钾埂,卻偏偏與公主長得像河闰,于是被迫代替她去往敵國和親科平。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法姜性,類相關(guān)的語法瞪慧,內(nèi)部類的語法,繼承相關(guān)的語法部念,異常的語法弃酌,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • (一)Java部分 1、列舉出JAVA中6個(gè)比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,104評論 0 62
  • java:注解(Annotation)自定義注解入門 why give up treatment? 應(yīng)用場景:框架...
    狗一樣的江湖閱讀 957評論 0 0
  • 本文主要介紹簡單實(shí)現(xiàn)控制div屬性儡炼,該例子也可作為閉包的一個(gè)實(shí)例(雖然對于閉包仍然知之不詳)妓湘,同時(shí)記錄實(shí)現(xiàn)過程的一...
    可樂湯圓閱讀 607評論 0 0
  • 在看不見你的日子里, 你是詩乌询。 我和風(fēng)不會很想你榜贴, 去越過山崗。 你是遠(yuǎn)方妹田,是旅人的向往唬党, 我圓夢的地方。 我是一...
    行走江湖愿你知世不俗閱讀 168評論 1 1