国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

字符串的不變性

zhaochunqi / 2113人閱讀

摘要:不少語(yǔ)言對(duì)字符串的實(shí)現(xiàn),都采用了限定不變性。字符串的不可變性有不少好處,但是如果程序員忘了這一點(diǎn)也會(huì)導(dǎo)致問(wèn)題。所以字符串不可變就是存儲(chǔ)的代價(jià)。另一個(gè)場(chǎng)景是字符串可以用于哈希表的鍵,而鍵是不可以改變值的。

像是js,以及c#等一系列的語(yǔ)言,推出任何一個(gè)特征都要和c比一比,你知道的:)。

string的不可變性也是一樣,你看:

C的string是可以改變的。
你可以

char str[] = "Foo";
str[0] = ‘G"

str的內(nèi)容確實(shí)被改變了。可以通過(guò)print來(lái)證明。打印內(nèi)容,也打印指針。指針不變,內(nèi)容變了。

2.js的不可改.如下的代碼,沒(méi)有任何效果,也可以log出來(lái)證明
var str = "foo";
str[0] = "g" ;

因?yàn)椋Z(yǔ)義上來(lái)說(shuō),這樣做意味著原位修改str的內(nèi)存區(qū)內(nèi)容

但是你可以
var str = "foo";
var = "bar"

因?yàn)樵恢玫膬?nèi)存沒(méi)有修改,是新分配的。只是打印不了指針,不好直接證明。要么就看代碼,那就啰嗦了。非常非常的啰嗦。

不少語(yǔ)言對(duì)字符串的實(shí)現(xiàn),都采用了限定不變性。不能說(shuō)這是不費(fèi)解的:為何去創(chuàng)建一個(gè)新字符串,而不是去修改它呢?畢竟c就是這樣做的。

字符串的不可變性有不少好處,但是如果程序員忘了這一點(diǎn)也會(huì)導(dǎo)致問(wèn)題。

如下的c#代碼會(huì)創(chuàng)建10000個(gè)字符串對(duì)象,但是除了最后一個(gè),后面都是垃圾需要被回收的。

string s = string.Empty;

for (int i = 0; i < 10000; i++)
{
    s += "x";
}

通過(guò)cld profiler可以看到這張圖。

這樣的場(chǎng)景應(yīng)該使用StringBuilder。而不是字符串連接。

StringBuilder sb =  StringBuilder();
for( i = ; i < 10000; i++)
{
    sb.Append();
}
string x = sb.ToString();

針對(duì)js,也可以自己做一個(gè)StringBuilder

function StringBuilder() {
    this._array = [];
    this._index = 0;
}

StringBuilder.prototype.append = function (str) {
    this._array[this._index] = str;
    this._index++;
}

StringBuilder.prototype.toString = function () {
    return this._array.join("");
}

為何設(shè)計(jì)者決定實(shí)現(xiàn)不可變字符串呢?

這個(gè)和存儲(chǔ)優(yōu)化有關(guān)。字符串都存儲(chǔ)在俘虜池(intern pool)內(nèi),因?yàn)閟tring都在intern pool內(nèi),所以,相同的字符串引用一致。這樣的存儲(chǔ)效果很好。

可是,如果允許修改string,那么a修改了,b也會(huì)跟著修改,d也是。可是,語(yǔ)義上來(lái)說(shuō),我們認(rèn)為他們是不同的變量,不應(yīng)該聯(lián)動(dòng)。所以字符串不可變就是intern pool存儲(chǔ)的代價(jià)。

string a = "xx";
string b = "xx";
string c = "x";
string d = String.Intern(c + c);
Console.WriteLine((object)a == (object)b); Console.WriteLine((object)a == (object)d);

String的intern()方法就是擴(kuò)充常量池的一個(gè)方法;當(dāng)一個(gè)String實(shí)例str調(diào)用intern()方法時(shí),c# 查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒(méi)有,則在常量池中增加一個(gè)Unicode等于str的字符串并返回它的引用;

不變性,對(duì)多線程應(yīng)用是有好處的。
另一個(gè)場(chǎng)景是字符串可以用于哈希表的鍵,而鍵是不可以改變值的。

string key = "abc";
Hashtable ht = new Hashtable();
ht.Add(key, 123);

key = "xbc";

Console.WriteLine(key); // xbc
Console.WriteLine(ht["abc"]); // 123

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/85554.html

相關(guān)文章

  • [譯]JavaScript中的不變性(Immutability)

    摘要:整個(gè)這個(gè)雷區(qū)面板都是由的和組成的,最后由的方法對(duì)其進(jìn)行不可變化處理剩下的主要邏輯部分就是掃雷了,傳入掃雷游戲?qū)ο笠粋€(gè)不可變結(jié)構(gòu)做為第一個(gè)參數(shù),以及要掃的那個(gè)雷區(qū)塊對(duì)象,最后返回新的掃雷游戲?qū)嵗? 不可變性(Immutability)是函數(shù)式編程的核心原則,在面向?qū)ο缶幊汤镆灿写罅繎?yīng)用。在這篇文章里,我會(huì)給大家秀一下到底什么是不可變性(Immutability)、她為什么還這么屌、以及在...

    clasnake 評(píng)論0 收藏0
  • 第3章:抽象數(shù)據(jù)類(lèi)型(ADT)和面向?qū)ο缶幊蹋∣OP) 3.1數(shù)據(jù)類(lèi)型和類(lèi)型檢查

    摘要:所有變量的類(lèi)型在編譯時(shí)已知在程序運(yùn)行之前,因此編譯器也可以推導(dǎo)出所有表達(dá)式的類(lèi)型。像變量的類(lèi)型一樣,這些聲明是重要的文檔,對(duì)代碼讀者很有用,并由編譯器進(jìn)行靜態(tài)檢查。對(duì)象類(lèi)型的值對(duì)象類(lèi)型的值是由其類(lèi)型標(biāo)記的圓。 大綱 1.編程語(yǔ)言中的數(shù)據(jù)類(lèi)型2.靜態(tài)與動(dòng)態(tài)數(shù)據(jù)類(lèi)型3.類(lèi)型檢查4.易變性和不變性5.快照?qǐng)D6.復(fù)雜的數(shù)據(jù)類(lèi)型:數(shù)組和集合7.有用的不可變類(lèi)型8.空引用9.總結(jié) 編程語(yǔ)言中的數(shù)據(jù)...

    zhangqh 評(píng)論0 收藏0
  • String 的不變性

    摘要:的不變性,如下圖所示,當(dāng)你改變了的之后指向了一個(gè)新的對(duì)象原對(duì)象不做改變。但其引用的數(shù)組是可變的。所以的不可變性的關(guān)鍵并不是的作用。同時(shí)編寫(xiě)者為了避免因?yàn)榈牟豢勺冃詫?dǎo)致占用大量空間,為此設(shè)計(jì)了字符串常量池 在貓眼的面試中被面試官問(wèn)到為什么String的字符串是不變的。當(dāng)時(shí)我的回答是因?yàn)镾tring類(lèi)是用final關(guān)鍵字修飾的,當(dāng)被問(wèn)到為什么用 final修飾就是不可變的時(shí)候我發(fā)現(xiàn)自己說(shuō)的...

    sydMobile 評(píng)論0 收藏0
  • Java的String不可變性

    摘要:但是通過(guò)構(gòu)造函數(shù)的并不是。通過(guò)構(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è)語(yǔ)言中或多或少都有些特殊地位。在Java亦不例外。今天先來(lái)討論,String是不可變的。 String是引用類(lèi)型,String變量?jī)?chǔ)存一個(gè)地址,地址指向內(nèi)...

    atinosun 評(píng)論0 收藏0
  • 翻譯連載 | JavaScript輕量級(jí)函數(shù)式編程-第6章:值的不變性 |《你不知道的JS》姊妹篇

    摘要:但在開(kāi)始之前應(yīng)該心中有數(shù)值的不可變性并不是說(shuō)我們不能在程序編寫(xiě)時(shí)不改變某個(gè)值。這些都是對(duì)值的不可變這個(gè)概念的誤解。程序的其他部分不會(huì)影響的賦值。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是 CSS 里最閃...

    ysl_unh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<