java String的intern方法
首先我們應(yīng)該清楚的是JDK1.6和JDK1.7中String類的intern方法還是有差別的:
JDK1.6中的intern:
調(diào)用intern方法的時(shí)候首先會(huì)去常量池中查看是否存在與當(dāng)前String值相同的值,如果存在的話,則直接返回常量池中這個(gè)String值的引用;如果不存在的話,則會(huì)將原先堆中的該字符串拷貝一份到常量池中。
JDK1.7中的intern:
調(diào)用intern方法的時(shí)候首先會(huì)去常量池中查看是否存在與當(dāng)前String值相同的值,如果存在的話,則直接返回常量池中這個(gè)String值的引用;如果不存在的話,則只會(huì)將原先堆中該字符串的引用放置在常量池中,并不會(huì)將拷貝整個(gè)字符串到常量池中。
這也就說明,JDK1.6和JDK1.7對(duì)于常量池中不存在此字符串的情況處理不同。
下面通過實(shí)例來進(jìn)行驗(yàn)證和解釋:
實(shí)例:
public static void main(String[] args) {
String str = "str"+new String("01");①
str.intern();②
String str1 = "str01";③
System.out.println(str == str1);
String str2 = new String("str01");④
str2.intern();⑤
String str3 = "str01";⑥
System.out.println(str2 == str3);
String str4 = "str01";⑦
String str5 = new String("str")+new String("01");⑧
str5.intern();⑨
System.out.println(str4 == str5);
在JDK1.6下輸出結(jié)果是:
false
false
false
解釋:
①執(zhí)行時(shí)會(huì)在堆內(nèi)存創(chuàng)建一個(gè)值為"str01"的字符串對(duì)象str,同時(shí)在常量池創(chuàng)建一個(gè)"str"以及"01"常量;
②執(zhí)行時(shí)會(huì)首先去常量池中查看是否存在一個(gè)值為"str01"的常量,發(fā)現(xiàn)不存在,JDK1.6的做法就是將該字符串"str01"在常量池中也生成一份;
③執(zhí)行時(shí)會(huì)在常量池中創(chuàng)建一個(gè)"str01"對(duì)象,發(fā)現(xiàn)已經(jīng)存在,因而不會(huì)新建;
第一個(gè)輸出false的原因是:str指向的是堆內(nèi)存的"str01",而str1指向的是常量池中的"str01";
④執(zhí)行時(shí)會(huì)在堆內(nèi)存創(chuàng)建一個(gè)值為"str01"的字符串對(duì)象str2,同時(shí)在常量池中創(chuàng)建一個(gè)值為"str01"的常量;
⑤執(zhí)行時(shí)會(huì)首先去常量池中查看是否存在值為"str01"的常量,發(fā)現(xiàn)存在,則直接返回這個(gè)常量引用;
⑥執(zhí)行時(shí)會(huì)在常量池中創(chuàng)建一個(gè)值為"str01"的常量,如果發(fā)現(xiàn)已經(jīng)存在,則不會(huì)創(chuàng)建;
第二個(gè)輸出false的原因是:str2指向的是堆內(nèi)存的"str01",而str3指向的是常量池中的"str01";
⑦執(zhí)行時(shí)會(huì)在常量池創(chuàng)建一個(gè)值為"str01"的常量;
⑧執(zhí)行時(shí)會(huì)在堆內(nèi)存創(chuàng)建一個(gè)值為"str01"的字符串對(duì)象str5,同時(shí)在常量池創(chuàng)建一個(gè)"str"以及"01"常量;
⑨執(zhí)行時(shí)會(huì)去常量池查看是否存在值為"str01"的常量,發(fā)現(xiàn)存在則直接返回這個(gè)常量引用;
第三個(gè)輸出false的原因是:str5指向的是堆內(nèi)存的"str01",而str4指向的是常量池中的"str01";
在JDK1.7下輸出結(jié)果是:
true
false
false
解釋:
發(fā)現(xiàn)只有第一個(gè)輸出結(jié)果不一樣,所以我們只解釋第一個(gè)的原因:
①執(zhí)行時(shí)會(huì)在堆內(nèi)存創(chuàng)建一個(gè)值為"str01"的字符串對(duì)象str,同時(shí)在常量池創(chuàng)建一個(gè)"str"以及"01"常量;(這點(diǎn)和JDK1.6沒什么區(qū)別)
②執(zhí)行時(shí)會(huì)首先去常量池中查看是否存在一個(gè)值為"str01"的常量,發(fā)現(xiàn)不存在,JDK1.7的做法就是將堆內(nèi)存中"str01"的引用復(fù)制到了常量池中;
③執(zhí)行時(shí)會(huì)在常量池中創(chuàng)建一個(gè)"str01"對(duì)象,發(fā)現(xiàn)已經(jīng)存在,因而不會(huì)新建;
那么此時(shí)的str和str1都將指向的是堆內(nèi)存中的"str01"的值,所以兩者相等;
以上就是對(duì)JDK1.6和JDK1.7中String類的intern方法的對(duì)比,是有差別的,有需要的朋友可以參考下。
相關(guān)文章
Java實(shí)現(xiàn)Word轉(zhuǎn)PDF的全過程
在IT領(lǐng)域,文檔格式轉(zhuǎn)換是常見的任務(wù)之一,特別是在管理大量文本數(shù)據(jù)時(shí),本文將詳細(xì)探討如何利用Java技術(shù)將Word文檔(.docx)轉(zhuǎn)換成PDF格式,需要的朋友可以參考下2025-04-04
淺析final,finally,finalize 的區(qū)別
以下是對(duì)final,finally,finalize的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09
Java開發(fā)實(shí)現(xiàn)人機(jī)猜拳游戲
這篇文章主要為大家詳細(xì)介紹了Java開發(fā)實(shí)現(xiàn)人機(jī)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
Java后端限制頻繁請(qǐng)求和重復(fù)提交的實(shí)現(xiàn)
很多用戶會(huì)請(qǐng)求過于頻繁或者是多次重復(fù)提交數(shù)據(jù),本文主要介紹了Java后端限制頻繁請(qǐng)求和重復(fù)提交的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
MyBatis-Flex實(shí)現(xiàn)多表聯(lián)查(自動(dòng)映射)
我們可以輕松的使用 Mybaits-Flex 鏈接任何數(shù)據(jù)庫,本文主要介紹了MyBatis-Flex實(shí)現(xiàn)多表聯(lián)查(自動(dòng)映射),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06

