基於JDK1.6和JDK1.7對String.intern()方法的理解

最近看了深入理解Java虛擬機,對String.intern()方法虛擬機的實現很是不理解,經過查找網上的各類文章,現在總結一部分。

在理解String.intern()方法之前,我覺得首先應該瞭解一下通過創建對象的方式和直接創建字符串的方式對象生成機制便於理解一下代碼。

String str1 = new String("1");//--創建對象的方式

這種創建方式,是在堆中創建一個字符串爲“1”的對象,並返回該字符串在堆中的地址信息,str1該引用指向堆中的地址信息。如圖:

 

 

在JDK1.6中,String.intern()方法先去運行時常量池中查看有無該字符串,如果有,則直接返回該字符串在方法區的內存地址。如果沒有則會先將該字符串保存在常量池中,並返回該字符串在方法區的內存地址。也就是在JDK1.6中無論是是否需要在產量中新建該字符串,都會返回在常量池中該字符串的引用,即是內存地址。

//----代碼片段1(以下代碼運行在JDK1.6的環境中)

        String str1 = new String("1") + new String("2");//這一行代碼中,在堆中產生了一個字符串爲“12”的對象,但是在方法區中並沒有“12”這個字符串,但需要注意的是,方法區中已經有了“1”和“2”的字符串。
        String intern = str1.intern();//這一行代碼中, str1.intern() 判斷產量池中並沒有“12”,於是在常量池中創建一個“12”的字符串,此時返回的是常量池中“12”這個字符串的地址信息。對於intern和str1來說,一個是在堆中的地址,一個是在常量池中的地址,所以,肯定是不相等的,所以intern == str1爲false;
        String str2 = "12";//這一行代碼中,首先去常量池中查看有沒有“12”,發現已經有了字符串“12”,這時候是字符串而不是引用,於是返回常量池中“12”這個字符串的地址信息,其實和intern是一樣的返回值,所以intern==str2爲true;同理,str1和str2,str1是堆中的地址信息,str2是常量池中的地址信息,所以str2==str1,也是false;
        System.out.println(str1 == str2);//false
        System.out.println(intern == str1);//false
        System.out.println(intern == str2);//true

在JDK1.7中,String.intern()方法先去運行時常量池中查看有無該字符串,如果有,則直接返回該字符串在方法區的內存地址。這裏與JDK1.6中是相同的。如果沒有的話,則會將該字符串在堆中的內存地址複製一份,然後保存在方法區中,String.intern()方法返回的則是保存在方法區的內存地址信息,即該字符串對象在堆中的地址。

//----代碼片段1(以下代碼運行在JDK1.7的環境中)

        String str1 = new String("1") + new String("2");//這一行代碼中,在堆中產生了一個字符串爲“12”的對象,但是在方法區中並沒有“12”這個字符串,但需要注意的是,方法區中已經有了“1”和“2”的字符串。
        String intern = str1.intern();//這一行代碼中, str1.intern() 判斷產量池中並沒有“12”,於是將堆中“12”這個對象的地址信息複製到方法區中,並返回該地址信息(堆中的地址信息)。所以,intern的返回值與str1是一樣的地址信息,intern == str1爲true;
        String str2 = "12";//這一行代碼中,首先常產量池中查看有沒有“12”,發現已經有了字符串“12”的引用,於是不再創建,直接返回該地址信息(堆中的地址信息)。所以,其實str2和str1是一樣的地址信息,str1==str2爲true;intern的返回值與str2也是一樣的地址信息,所以intern == str2爲true。
        System.out.println(str1 == str2);//true
        System.out.println(intern == str1);//true
        System.out.println(intern == str2);//true

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章