欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

字符串池

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

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

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

下面是圖示:

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

緩存Hashcode

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

在String類(lèi)中,有以下代碼:

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

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

使其他類(lèi)的使用更加便利

在介紹這個(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ù)。上面的代碼只是為了簡(jiǎn)單說(shuō)明該問(wèn)題,其實(shí)String類(lèi)中并沒(méi)有value這個(gè)字段值。

安全性

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

代碼示例:

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

不可變對(duì)象天生就是線程安全的

因?yàn)椴豢勺儗?duì)象不能被改變,所以他們可以自由地在多個(gè)線程之間共享。不需要任何同步處理。

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

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

相關(guān)文章

  • Springboot整合策略模式詳解

    Springboot整合策略模式詳解

    這篇文章主要介紹了Springboot整合策略模式詳解的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Maven中pom.xml文件報(bào)錯(cuò)的原因解決

    Maven中pom.xml文件報(bào)錯(cuò)的原因解決

    創(chuàng)建Maven項(xiàng)目的時(shí)候,如果你選擇的Packaging為war,那么就會(huì)報(bào)錯(cuò),本文主要介紹了Maven中pom.xml文件報(bào)錯(cuò)的原因解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • tio-boot?jfinal-plugins框架整合redis示例詳解

    tio-boot?jfinal-plugins框架整合redis示例詳解

    這篇文章主要為大家介紹了tio-boot?jfinal-plugins框架整合redis示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • js中去除字符串中所有的html標(biāo)簽代碼實(shí)例

    js中去除字符串中所有的html標(biāo)簽代碼實(shí)例

    這篇文章主要介紹了js中去除字符串中所有的html標(biāo)簽代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Java中的HashMap源碼解析

    Java中的HashMap源碼解析

    這篇文章主要介紹了Java中的HashMap源碼解析,當(dāng)HashMap中的其中一個(gè)鏈表的對(duì)象個(gè)數(shù)如果達(dá)到了8個(gè),此時(shí)如果數(shù)組長(zhǎng)度沒(méi)有達(dá)到64,那么HashMap會(huì)先擴(kuò)容解決,如果已經(jīng)達(dá)到了64,那么這個(gè)鏈表會(huì)變成紅黑樹(shù),需要的朋友可以參考下
    2023-12-12
  • Spring?Boot實(shí)現(xiàn)MyBatis動(dòng)態(tài)創(chuàng)建表的操作語(yǔ)句

    Spring?Boot實(shí)現(xiàn)MyBatis動(dòng)態(tài)創(chuàng)建表的操作語(yǔ)句

    這篇文章主要介紹了Spring?Boot實(shí)現(xiàn)MyBatis動(dòng)態(tài)創(chuàng)建表,MyBatis提供了動(dòng)態(tài)SQL,我們可以通過(guò)動(dòng)態(tài)SQL,傳入表名等信息然組裝成建表和操作語(yǔ)句,本文通過(guò)案例講解展示我們的設(shè)計(jì)思路,需要的朋友可以參考下
    2024-01-01
  • Java中泛型的示例詳解

    Java中泛型的示例詳解

    泛型機(jī)制在項(xiàng)目中一直都在使用,不僅如此,很多源碼中都用到了泛型機(jī)制。本文將通過(guò)一些示例帶大家深入了解一下Java的泛型機(jī)制,需要的可以了解一下
    2022-10-10
  • 詳解SpringBoot 快速整合MyBatis(去XML化)

    詳解SpringBoot 快速整合MyBatis(去XML化)

    本篇文章主要介紹了詳解SpringBoot 快速整合MyBatis(去XML化),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-10-10
  • IDEA下使用MyBatisCodeHelper插件的方法詳解

    IDEA下使用MyBatisCodeHelper插件的方法詳解

    這篇文章主要介紹了IDEA下使用MyBatisCodeHelper插件的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • maven工程中讀取resources中的資源文件

    maven工程中讀取resources中的資源文件

    Web項(xiàng)目中應(yīng)該經(jīng)常有這樣的需求,在maven項(xiàng)目的resources目錄下放一些文件,比如一些配置文件,資源文件等,本文主要介紹了maven工程中讀取resources中的資源文件,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12

最新評(píng)論