關(guān)于String intern()在jvm常量池里發(fā)生的二三事

大概可以分為兩個(gè)時(shí)期:
當(dāng)調(diào)用 intern() 方法時(shí)

jdk1.7之前:

常量池是在方法區(qū)【永久代里面】的
檢查字符串池里是否存在這么一個(gè)字符串,如果存在,就返回池里的字符串;如果不存在,該方法會(huì)把字符串添加到字符串池中,然后再返回它的引用。
總結(jié)一下:反正這里返回的是字符串池里地址

jdk1.7(包括)之后:

常量池被放入到堆空間中
jvm只是在常量池記錄當(dāng)前字符串的引用,并返回當(dāng)前字符串的引用[這里返回的是堆的引用]
總結(jié)一下,如果池子里存在,返回池子里的地址,不存在 在池子里加入指向堆的引用,返回的是堆的地址

        String a="hello2";
        String m=new String("hello")+new String("2");
        System.out.println( m==a);
        System.out.println( m.intern()==a);

結(jié)果為 false
true
因?yàn)閙是堆里的地址,而"hello2"是字符串常量池里的地址,執(zhí)行m.intern()的時(shí)候,因?yàn)槌A砍匾呀?jīng)有了hello2所以直接返回hello2在常量池的引用,和a是一致的

 String m=new String("hello")+new String("2");
 m.intern();
 String a="hello2";
 System.out.println( m==a);

結(jié)果為true
因?yàn)樵趇ntern的時(shí)候,把m加入到常量池后,返回了該堆中的位置,而"hello2"的時(shí)候,去常量池一看,啊,已經(jīng)有這個(gè)引用了,就會(huì)直接返回這個(gè)引用地址,所以指向的是同一個(gè)地址

關(guān)于不同方式生成字符串的情況:

1.String str = "Hello";

首先會(huì)在堆里新生代的Eden區(qū)生成一個(gè)"Hello"的實(shí)例,還會(huì)生成字符串常量池(stringTable維護(hù))里生成一個(gè)引用 指向堆里的"Hello" 這時(shí)候str的位置是指向這個(gè)常量池的。

2.String str = new String("Hello");

new關(guān)鍵字會(huì)在堆申請(qǐng)一塊全新的內(nèi)存,來(lái)創(chuàng)建新對(duì)象。
然后這個(gè)str 直接指向了堆內(nèi)實(shí)例。同時(shí)如果常量池里沒有指向hello的字符串,會(huì)生成一個(gè)

3.final修飾的字符串

也是放在字符串常量池里的 所以其實(shí)和直接引號(hào)生成的對(duì)象是一樣的。是編譯階段就確定的值。

4.關(guān)于+號(hào)連接的字符串

如果包含new 的字符串 也是在堆里生成新的實(shí)例;
如果全是由引號(hào)連接的,會(huì)被加入字符串常量池
如果是一個(gè)String對(duì)象【一個(gè)變量】 會(huì)創(chuàng)建一個(gè)臨時(shí)的StringBuilder對(duì)象進(jìn)行實(shí)現(xiàn)拼接操作,用StringBuilder的append()方法拼接完畢,再調(diào)用toString()方法返回。在編譯階段無(wú)法確定值,只有在程序運(yùn)行期來(lái)動(dòng)態(tài)分配并將連接后的新地址賦給s2。返回的是堆里的地址
如果是一個(gè)final修飾的變量與字符串拼接,因?yàn)閒inal修飾的時(shí)候在編譯階段就會(huì)把這個(gè)值寫進(jìn)去,所以等同于兩個(gè)引號(hào)的字符串拼接,返回的是堆里的地址。
參考
http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/
https://www.zhihu.com/question/29884421/answer/113785601
http://blog.csdn.net/seu_calvin/article/details/52291082

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容