【JAVA基礎(chǔ)】String類(lèi)為什么是final的

1.聲明為final類(lèi)的目的

主要目的就是保證String是不可變(immutable)奈梳。不可變就是第二次給一個(gè)String 變量賦值的時(shí)候杈湾,不是在原內(nèi)存地址上修改數(shù)據(jù),而是重新指向一個(gè)新對(duì)象攘须,新地址漆撞。下面看String類(lèi)源碼如何保證是不可變的:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    /** The value is used for character storage. */
    private final char value[];

String類(lèi)的主力成員字段value是個(gè)char[ ]數(shù)組,而且是用final修飾的于宙。編譯器不允許把value指向另一個(gè)地址浮驳。但可以直接對(duì)數(shù)組元素修改。為了保證這個(gè)數(shù)組元素不能修改捞魁,做了如下措施:
(1)所有String的方法里很小心的沒(méi)有去動(dòng)數(shù)組里的元素至会,沒(méi)有暴露內(nèi)部成員字段。
(2)避免被其他人繼承后破壞署驻,整個(gè)String設(shè)成final禁止繼承奋献。如果有一個(gè)String的引用,它引用的一定是一個(gè)String對(duì)象旺上,而不可能是其他類(lèi)的對(duì)象瓶蚂。

2.為什么要不String設(shè)計(jì)為不可變

  • 從內(nèi)存角度來(lái)看
    字符串常量池的要求:創(chuàng)建字符串時(shí),如果該字符串已經(jīng)存在于池中宣吱,則將返回現(xiàn)有字符串的引用窃这,而不是創(chuàng)建新對(duì)象。多個(gè)String變量引用指向同一個(gè)內(nèi)地地址征候。如果字符串是可變的杭攻,用一個(gè)引用更改字符串將導(dǎo)致其他引用的值錯(cuò)誤。這是很危險(xiǎn)的疤坝。
  • 緩存Hashcode
    字符串的Hashcode在java中經(jīng)常配合基于散列的集合一起正常運(yùn)行兆解,這樣的散列集合包括HashSet、HashMap以及HashTable跑揉。不可變的特性保證了hashcode永遠(yuǎn)是相同的锅睛。不用每次使用hashcode就需要計(jì)算hashcode。這樣更有效率历谍。因?yàn)楫?dāng)向集合中插入對(duì)象時(shí)现拒,是通過(guò)hashcode判別在集合中是否已經(jīng)存在該對(duì)象了(不是通過(guò)equals方法逐個(gè)比較,效率低)望侈。
  • 方便其它類(lèi)使用
    其他類(lèi)的設(shè)計(jì)基于string不可變印蔬,如set存儲(chǔ)string,改變?cè)搒tring后set包含了重復(fù)值脱衙。
  • 安全性
    String被廣泛用作許多java類(lèi)的參數(shù)侥猬,例如網(wǎng)絡(luò)連接例驹、打開(kāi)文件等。如果對(duì)string的某一處改變一不小心就影響了該變量所有引用的表現(xiàn)陵究,則連接或文件將被更改眠饮,這可能導(dǎo)致嚴(yán)重的安全威脅。
    不可變對(duì)象不能被寫(xiě)铜邮,所以不可變對(duì)象自然是線程安全的仪召,因?yàn)椴豢勺儗?duì)象不能更改,它們可以在多個(gè)線程之間自由共享松蒜。

總結(jié) :由于效率和安全性的原因扔茅,字符串被設(shè)計(jì)為不可變

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秸苗,隨后出現(xiàn)的幾起案子召娜,更是在濱河造成了極大的恐慌,老刑警劉巖惊楼,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玖瘸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡檀咙,警方通過(guò)查閱死者的電腦和手機(jī)逛裤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)隧魄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事恬总『雎澹” “怎么了纪蜒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵瓤漏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我校套,道長(zhǎng)价脾,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任笛匙,我火速辦了婚禮侨把,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘膳算。我一直安慰自己,他們只是感情好弛作,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布涕蜂。 她就那樣靜靜地躺著,像睡著了一般映琳。 火紅的嫁衣襯著肌膚如雪机隙。 梳的紋絲不亂的頭發(fā)上蜘拉,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音有鹿,去河邊找鬼旭旭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛葱跋,可吹牛的內(nèi)容都是我干的持寄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼娱俺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稍味!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起荠卷,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤模庐,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后油宜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掂碱,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年慎冤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疼燥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粪薛,死狀恐怖悴了,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情违寿,我是刑警寧澤湃交,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站藤巢,受9級(jí)特大地震影響搞莺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掂咒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一才沧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绍刮,春花似錦温圆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至膝蜈,卻和暖如春锅移,著一層夾襖步出監(jiān)牢的瞬間熔掺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工非剃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留置逻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓备绽,卻偏偏與公主長(zhǎng)得像券坞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疯坤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • 一报慕、基礎(chǔ)知識(shí):1、JVM压怠、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,369評(píng)論 0 4
  • (一)Java部分 1眠冈、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,083評(píng)論 0 62
  • 國(guó)貿(mào)161 李尉楠 06
    lloym閱讀 311評(píng)論 0 0
  • 兒子蜗顽,今天是你五周歲生日。 陽(yáng)光明媚的春日雨让,有如你生命的燦爛雇盖。 半個(gè)月前,當(dāng)我一個(gè)人站在揚(yáng)州回南京的動(dòng)車(chē)上栖忠,看到一...
    01bbe83ab4b0閱讀 344評(píng)論 1 1
  • 風(fēng)塵仆仆的趕來(lái)就是為了和你不期而遇崔挖,我也終于知道為何來(lái)到這所陌生城市的時(shí)候,身上是厚重的陳舊味庵寞,為的便是洗凈鉛華狸相,...
    玉米甜餅閱讀 660評(píng)論 -1 6