Java-String類 為什么不可變?衡创?帝嗡?

String類概述

String 類被final修飾,無子類璃氢,不可被復寫哟玷,對String類的任何改變,都會返回一個新的String類對象一也。

什么是不可變對象巢寡,有什么好處

不可變對象是指一個對象的狀態(tài)在對象創(chuàng)建之后就不再變化(一旦被創(chuàng)建,就不能修改它的值)椰苟。

創(chuàng)建一個不可變對象

  1. 將類聲明為final,不能被繼承抑月;
  2. 所有成員聲明為私有,不允許直接訪問這些成員舆蝴;
  3. 對變量不提供setter方法谦絮;
  4. 所有可變的成員聲明為final,只能對它們賦值一次题诵;
  5. 通過構(gòu)造器初始化所有成員,進行深拷貝层皱;
  6. 再getter方法中性锭,不直接返回對象本身,而是克隆對象奶甘,并返回對象的拷貝篷店;

String類源碼

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

    /** Cache the hash code for the string */
    private int hash; // Default to 0
    
    //other codes
}

不可變對象好處

  1. 不可變對象容易構(gòu)造,效率高臭家;
  2. 線程安全疲陕;
  3. 容易緩存,避免null的引用钉赁;
  4. 避免時間的耦合蹄殃;

從性能和安全倆個方面說為什么String類不可變的

  1. 安全
    引發(fā)的安全問題:程序中的用戶姓名、密碼你踩、數(shù)據(jù)庫信息诅岩、URL、IP等等都是以String形式傳入带膜,因此它的值是不可變的吩谦,改變引用的值會造成安全漏洞;
    線程安全:再多線程并發(fā)情況下膝藕,多個線程同時讀寫資源式廷,會引起競爭問題,由于String是不可變的芭挽,不會引發(fā)線程問題滑废;
    HashCode:也就源碼中的hash,當String被創(chuàng)建出來,hashcode也會被隨之存儲袜爪,hashcode的計算和value有關(guān)蠕趁,如果String可變,那hashcode也會隨之改變辛馆,針對Map俺陋、Set等容器,需要保持鍵值的唯一性和一致性,所以String更適合容器的鍵值;
  2. 性能
    當字符串是不可變的時候航棱,字符串常量池才有意義。字符串常量池的出現(xiàn)寿酌,減少創(chuàng)建相同的字面量的字符串,讓不同的引用指向同一個字符串硕蛹,為運行時節(jié)省很多堆內(nèi)存醇疼。若字符串可變硕并,字符串常量池將失去意義,每次創(chuàng)建新的String,都將開辟新的空間秧荆,占據(jù)更多內(nèi)存倔毙;

總結(jié)

其實String類不可變的特性應用無處不在,這里從性能和安全倆個方面主要分析乙濒,也是代碼中最常涉及到的陕赃。如果有不同的思考,歡迎交流學習颁股。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末么库,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子甘有,更是在濱河造成了極大的恐慌诉儒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亏掀,死亡現(xiàn)場離奇詭異忱反,居然都是意外死亡,警方通過查閱死者的電腦和手機滤愕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門温算,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人间影,你說我怎么就攤上這事注竿。” “怎么了宇智?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵蔓搞,是天一觀的道長胰丁。 經(jīng)常有香客問我随橘,道長,這世上最難降的妖魔是什么锦庸? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任机蔗,我火速辦了婚禮,結(jié)果婚禮上甘萧,老公的妹妹穿的比我還像新娘萝嘁。我一直安慰自己,他們只是感情好扬卷,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布牙言。 她就那樣靜靜地躺著,像睡著了一般怪得。 火紅的嫁衣襯著肌膚如雪咱枉。 梳的紋絲不亂的頭發(fā)上卑硫,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音蚕断,去河邊找鬼欢伏。 笑死,一個胖子當著我的面吹牛亿乳,可吹牛的內(nèi)容都是我干的硝拧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼葛假,長吁一口氣:“原來是場噩夢啊……” “哼障陶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起聊训,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤咸这,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后魔眨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媳维,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年遏暴,在試婚紗的時候發(fā)現(xiàn)自己被綠了侄刽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡朋凉,死狀恐怖州丹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杂彭,我是刑警寧澤墓毒,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站亲怠,受9級特大地震影響所计,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜团秽,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一主胧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧习勤,春花似錦踪栋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至予颤,卻和暖如春囤官,著一層夾襖步出監(jiān)牢的瞬間厢破,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工治拿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摩泪,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓劫谅,卻偏偏與公主長得像见坑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捏检,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法荞驴,類相關(guān)的語法,內(nèi)部類的語法贯城,繼承相關(guān)的語法熊楼,異常的語法,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • 一能犯、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計...
    子非魚_t_閱讀 4,154評論 1 44
  • 記得我愛你 不管發(fā)生什么事鲫骗,要冷靜,要反省 記得我愛你 要抵擋得了誘惑踩晶,要控制得住脾氣 記得我愛你 別好高騖遠执泰,別...
    Leona的矯情世界閱讀 248評論 0 2
  • 大家好术吝!我是唐斌。我這個觀點說出來呢很多人就要吐槽了茸苇,但是這是真理排苍!我覺得最厲害的營銷高手就是小孩子,想要一個東西...
    我看你有料閱讀 692評論 0 1
  • 不太在人前哭学密,不太相信沒有退路的愛情淘衙,不敢迷路,從不旅游则果,躲在屁大的被窩里意淫年薪百萬幔翰,坐享榮華漩氨。半夜躲著一個人沉...
    黃話嘮閱讀 371評論 0 1