最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

為什么Java要把字符串設(shè)計成不可變的

 更新時間:2017年06月26日 14:33:47   投稿:lijiao  
為什么Java要把字符串設(shè)計成不可變的,這篇文章給出了Java字符串設(shè)計成不可變的原因,感興趣的小伙伴們可以參考一下

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

字符串池

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

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

String string1 = "abcd";
String string2 = "abcd";

下面是圖示:

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

緩存Hashcode

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

在String類中,有以下代碼:

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

以上代碼中hash變量中就保存了一個String對象的hashcode,因為String類不可變,所以一旦對象被創(chuàng)建,該hash值也無法改變。所以,每次想要使用該對象的hashcode的時候,直接返回即可。

使其他類的使用更加便利

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

HashSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));

for(String a: set)
 a.value = "a";

在上面的例子中,如果字符串可以被改變,那么以上用法將有可能違反Set的設(shè)計原則,因為Set要求其中的元素不可以重復(fù)。上面的代碼只是為了簡單說明該問題,其實String類中并沒有value這個字段值。

安全性

String被廣泛的使用在其他Java類中充當(dāng)參數(shù)。比如網(wǎng)絡(luò)連接、打開文件等操作。如果字符串可變,那么類似操作可能導(dǎo)致安全問題。因為某個方法在調(diào)用連接操作的時候,他認(rèn)為會連接到某臺機(jī)器,但是實際上并沒有(其他引用同一String對象的值修改會導(dǎo)致該連接中的字符串內(nèi)容被修改)??勺兊淖址部赡軐?dǎo)致反射的安全問題,因為他的參數(shù)也是字符串。

代碼示例:

boolean connect(string s){
 if (!isSecure(s)) { 
throw new SecurityException(); 
}
 //如果s在該操作之前被其他的引用所改變,那么就可能導(dǎo)致問題。 
 causeProblem(s);
}

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

因為不可變對象不能被改變,所以他們可以自由地在多個線程之間共享。不需要任何同步處理。

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

永顺县| 唐河县| 南江县| 沙坪坝区| 偏关县| 安乡县| 遂宁市| 平顺县| 元朗区| 通山县| 大荔县| 乐亭县| 贵阳市| 郓城县| 西乌珠穆沁旗| 平阴县| 临澧县| 大邑县| 德兴市| 浮梁县| 铁岭市| 读书| 达孜县| 慈利县| 剑川县| 肥城市| 家居| 永和县| 崇左市| 巴楚县| 颍上县| 比如县| 库车县| 慈溪市| 冕宁县| 平定县| 新化县| 和硕县| 农安县| 偏关县| 库尔勒市|