免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

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

字符串池

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

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

String string1 = 'abcd';String string2 = 'abcd';

下面是圖示:

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

緩存Hashcode

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

在String類中,有以下代碼:

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

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

使其他類的使用更加便利

在介紹這個(gè)內(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è)計(jì)原則,因?yàn)镾et要求其中的元素不可以重復(fù)。上面的代碼只是為了簡單說明該問題,其實(shí)String類中并沒有value這個(gè)字段值。

安全性

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

代碼示例:

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

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

因?yàn)椴豢勺儗ο蟛荒鼙桓淖?,所以他們可以自由地在多個(gè)線程之間共享。不需要任何同步處理。

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

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
為什么String被設(shè)計(jì)成不可變
靈魂拷問:為什么 Java 字符串是不可變的?
[Java面經(jīng)]干貨整理, Java面試題(覆蓋Java基礎(chǔ),Java高級,JavaEE,數(shù)據(jù)庫,設(shè)計(jì)模式等)
java hashCode詳解
Java筆試題分類總結(jié)
來自投資銀行的20個(gè)Java面試題 – 碼農(nóng)網(wǎng)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服