摘要:的不變性,如下圖所示,當(dāng)你改變了的之后指向了一個(gè)新的對(duì)象原對(duì)象不做改變。但其引用的數(shù)組是可變的。所以的不可變性的關(guān)鍵并不是的作用。同時(shí)編寫者為了避免因?yàn)榈牟豢勺冃詫?dǎo)致占用大量空間,為此設(shè)計(jì)了字符串常量池
在貓眼的面試中被面試官問到為什么String的字符串是不變的。當(dāng)時(shí)我的回答是因?yàn)?b>String類是用final關(guān)鍵字修飾的,當(dāng)被問到為什么用 final修飾就是不可變的時(shí)候我發(fā)現(xiàn)自己說的并沒有什么道理。之后自己專門查了一下為什么。
String的不變性,如下圖所示,當(dāng)你改變了s的之后s指向了一個(gè)新的對(duì)象原對(duì)象不做改變。
看一下源碼是怎么實(shí)現(xiàn)的:
我們看到String被定義為final,所以說String是不可繼承的,接著我們看到String的內(nèi)部實(shí)現(xiàn)是一個(gè)char數(shù)組,并且定義為final。這時(shí)有些人可能認(rèn)為final修飾的字段創(chuàng)建以后就不可改變,所以就完了,但其實(shí)不是這樣的。
因?yàn)殡m然value是不可變,也只是value這個(gè)引用地址不可變。但其引用的Array數(shù)組是可變的。
final int[] value={1,2,3}; value[2]=100; //這時(shí)候數(shù)組里已經(jīng)是{1,2,100}
所以根本上String是不可變的原因是sun工程師很好的封裝了value數(shù)組,在其中所有的方法中不去更改value數(shù)組,并把它定義為private,并且把整個(gè)String設(shè)成final禁止繼承,避免被其他人繼承后破壞。所以String的不可變性的關(guān)鍵并不是final的作用。
同時(shí)Java編寫者為了避免因?yàn)镾tring的不可變性導(dǎo)致占用大量空間,為此設(shè)計(jì)了字符串常量池
String one = "someString"; String two = "someString";
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73853.html
摘要:整個(gè)這個(gè)雷區(qū)面板都是由的和組成的,最后由的方法對(duì)其進(jìn)行不可變化處理剩下的主要邏輯部分就是掃雷了,傳入掃雷游戲?qū)ο笠粋€(gè)不可變結(jié)構(gòu)做為第一個(gè)參數(shù),以及要掃的那個(gè)雷區(qū)塊對(duì)象,最后返回新的掃雷游戲?qū)嵗? 不可變性(Immutability)是函數(shù)式編程的核心原則,在面向?qū)ο缶幊汤镆灿写罅繎?yīng)用。在這篇文章里,我會(huì)給大家秀一下到底什么是不可變性(Immutability)、她為什么還這么屌、以及在...
摘要:但是通過構(gòu)造函數(shù)的并不是。通過構(gòu)造函數(shù)創(chuàng)建的變量在機(jī)制上與其他對(duì)象一致,都是在上創(chuàng)建新的對(duì)象,然后把引用賦給變量。此外,的方法和等方法實(shí)現(xiàn)均是調(diào)用了構(gòu)造函數(shù)創(chuàng)建了新的對(duì)象,所以他們返回的也都是存在于上的新對(duì)象。 String經(jīng)常在一個(gè)語言中或多或少都有些特殊地位。在Java亦不例外。今天先來討論,String是不可變的。 String是引用類型,String變量儲(chǔ)存一個(gè)地址,地址指向內(nèi)...
摘要:不少語言對(duì)字符串的實(shí)現(xiàn),都采用了限定不變性。字符串的不可變性有不少好處,但是如果程序員忘了這一點(diǎn)也會(huì)導(dǎo)致問題。所以字符串不可變就是存儲(chǔ)的代價(jià)。另一個(gè)場景是字符串可以用于哈希表的鍵,而鍵是不可以改變值的。 像是js,以及c#等一系列的語言,推出任何一個(gè)特征都要和c比一比,你知道的:)。 string的不可變性也是一樣,你看: C的string是可以改變的。 你可以 char str...
摘要:文本已收錄至我的倉庫,歡迎記錄一次在寫代碼時(shí)愚蠢的操作,本文涉及到的知識(shí)點(diǎn)不可變性一交代背景我這邊有一個(gè)系統(tǒng),提供一個(gè)接口去發(fā)送短信。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 記錄一次在寫代碼時(shí)愚蠢的操作,本文涉及到的知識(shí)點(diǎn):String不可變性 一、交代背景 我這邊有一個(gè)系統(tǒng),...
摘要:但在開始之前應(yīng)該心中有數(shù)值的不可變性并不是說我們不能在程序編寫時(shí)不改變某個(gè)值。這些都是對(duì)值的不可變這個(gè)概念的誤解。程序的其他部分不會(huì)影響的賦值。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃...
閱讀 1762·2021-09-23 11:34
閱讀 2485·2021-09-22 15:45
閱讀 12997·2021-09-22 15:07
閱讀 2245·2021-09-02 15:40
閱讀 4152·2021-07-29 14:48
閱讀 1083·2019-08-30 15:55
閱讀 3252·2019-08-30 15:55
閱讀 2198·2019-08-30 15:55