亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

分析Java中為什么String不可變

瀏覽:25日期:2022-08-11 10:01:56
目錄常量池便利安全引申問(wèn)題String在Java中的【引用傳遞】常量池

Java中我們創(chuàng)建String對(duì)象有兩種基本方法。

String str1 = 'zxhtom';String str2 = new String('zxhtom');

上面兩種方式我們創(chuàng)建了兩個(gè)String變量 。 但是第一種通過(guò)雙引號(hào)創(chuàng)建的zxhtom這個(gè)對(duì)象我們稱之為常量 。 在JVM中是存儲(chǔ)在一塊叫【常量池】中的。而第二種str2是我們稱之為普通變量。new一次就在JVM中開(kāi)辟一塊內(nèi)存。

【常量池】的作用就是復(fù)用,當(dāng)同樣的內(nèi)容再次被通過(guò)常量方式創(chuàng)建的時(shí)候Java會(huì)指向同一塊地址。通過(guò)如下代碼理解:

String z1 = 'zxhtom';String z2 = 'zxhtom';

分析Java中為什么String不可變

通過(guò)上圖我們可以了解 z1 , z2兩個(gè)變量其實(shí)引用的是同一內(nèi)存地址 。 所以z1==z2 為true .

到這里引發(fā)出為什么String被設(shè)計(jì)為不可變 。 上列中z1 被修改成zxh . 如果String是可變得那么z2就會(huì)被莫名其妙修改成zxh .

便利

在Java中判斷兩個(gè)對(duì)象相等時(shí)通過(guò)地址判斷。但是地址被抽象話為一段hash函數(shù)。在Java使用中hash是經(jīng)常被使用的。將String設(shè)置為不可變性那么hash就可以一直使用下去。不需要重新計(jì)算體現(xiàn)了便捷性

安全

仍是上面的情況 , z2會(huì)被不知情的情況下被修改了。這在多線程中很常見(jiàn)。我們?cè)谑褂玫臅r(shí)候會(huì)被其他情況將數(shù)據(jù)更改。這樣我們的數(shù)據(jù)將會(huì)失去了準(zhǔn)確性。

引申問(wèn)題

在上部中我們提到String的常量池。針對(duì)常量池引發(fā)思考 【String.intern()】

該方法的功能就是擴(kuò)充【常量池】。z2.intern() 表示判斷常量池中是否存在與該值相同的對(duì)象如果有則返回該對(duì)象的引用。 如果沒(méi)有則將該值注冊(cè)到內(nèi)存中。注意這里并不是將z2對(duì)象注冊(cè)過(guò)去。而是將z2的值注冊(cè)進(jìn)去。

String z1=new String('zxhtom');String z2=z1.intern();System.out.println( z1==z1.intern() );System.out.println( z1.hashCode()+' '+z2.hashCode() );System.out.println( z2==z1 );System.out.println( z2==z1.intern() );

輸出結(jié)構(gòu)

false

-688175064 -688175064

false

true

分析一下輸出結(jié)果不難發(fā)現(xiàn),z1.intern()是常量池中沒(méi)有zxhtom,會(huì)將zxhtom值創(chuàng)建到常量池中,z2就是引用常量池中的引用。這個(gè)時(shí)候z1==z2 為false說(shuō)明注冊(cè)到常量池中的并不是z1的地址,而是相當(dāng)于z1的一個(gè)對(duì)象拷貝。

string創(chuàng)建方式的確定簡(jiǎn)單歸結(jié):

通過(guò)雙引號(hào)創(chuàng)建的 == 常量創(chuàng)建 通過(guò)常量拼接 == 常量創(chuàng)建 通過(guò)非常量與常量拼接 = 非常量創(chuàng)建 通過(guò)new 創(chuàng)建 == 非常量創(chuàng)建String在Java中的【引用傳遞】

在Java中方法參數(shù)傳遞都是通過(guò)值傳遞的。但是為什么String給我們的感覺(jué)是引用傳遞的呢?

public static void main(String[] args) {String x = new String('ab');change(x);System.out.println(x);} public static void change(String x) {x = 'cd';}

String不是基本對(duì)象所以String是引用傳遞。但是這里的引用傳遞知識(shí)傳遞String引用的地址 .當(dāng)執(zhí)行x=cd是原來(lái)ab的對(duì)象還在JVM中。外部x的引用地址沒(méi)有變 。 變得知識(shí)change方法中x的指向。所以外部打印的還是ab

以上就是分析Java中為什么String不可變的詳細(xì)內(nèi)容,更多關(guān)于Java中為什么String不可變的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 午夜精品aaa国产福利 | 亚洲欧美久久精品 | 亚洲欧美一区二区视频 | 日本亚洲欧美国产日韩ay高清 | 午夜在线视频一区二区三区 | 五月天久久婷婷 | 欧美人成一本免费观看视频 | 在线视频不卡国产在线视频不卡 | 片在线观看视频免费 | 伊人情涩网 | 麻豆精品在线观看 | 美女性高潮视频 | 国产精品4p露脸在线播放 | 日韩免费一区二区三区在线 | 成人免费黄色片 | 国产亚洲久久 | 伊人久久国产精品 | 男人j桶进女人p无遮挡动态图二三 | 黄色片aa| 亚洲自拍激情 | 亚洲九九九 | 国美女福利视频午夜精品 | 91免费网站| 欧美卡1卡2卡三卡网站入口 | 日本黄大片在线观看视频 | 亚洲欧美在线看 | 亚洲国产欧美在线 | 国产乱淫a∨片免费视频 | 亚洲欧美在线精品一区二区 | 国产成人在线视频免费观看 | 亚洲欧美在线精品 | 香蕉视频大全 | 手机看片1024欧美一级 | 色视频线观看在线播放 | 蕾丝视频www在线观看 | 亚洲欧美另类日本久久影院 | 高潮影院 | 国产精品尤物在线 | 欧美三级在线播放 | 国产www在线播放 | 欧美黄网站 |