java String的intern辦法。本站提示廣大學習愛好者:(java String的intern辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java String的intern辦法正文
起首我們應當清晰的是JDK1.6和JDK1.7中String類的intern辦法照樣有差異的:
JDK1.6中的intern:
挪用intern辦法的時刻起首會去常量池中檢查能否存在與以後String值雷同的值,假如存在的話,則直接前往常量池中這個String值的援用;假如不存在的話,則會將本來堆中的該字符串拷貝一份到常量池中。
JDK1.7中的intern:
挪用intern辦法的時刻起首會去常量池中檢查能否存在與以後String值雷同的值,假如存在的話,則直接前往常量池中這個String值的援用;假如不存在的話,則只會將本來堆中該字符串的援用放置在常量池中,其實不會將拷貝全部字符串到常量池中。
這也就解釋,JDK1.6和JDK1.7關於常量池中不存在此字符串的情形處置分歧。
上面經由過程實例來停止驗證息爭釋:
實例:
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下輸入成果是:
false
false
false
說明:
①履行時會在堆內存創立一個值為"str01"的字符串對象str,同時在常量池創立一個"str"和"01"常量;
②履行時會起首去常量池中檢查能否存在一個值為"str01"的常量,發明不存在,JDK1.6的做法就是將該字符串"str01"在常量池中也生成一份;
③履行時會在常量池中創立一個"str01"對象,發明曾經存在,因此不會新建;
第一個輸入false的緣由是:str指向的是堆內存的"str01",而str1指向的是常量池中的"str01";
④履行時會在堆內存創立一個值為"str01"的字符串對象str2,同時在常量池中創立一個值為"str01"的常量;
⑤履行時會起首去常量池中檢查能否存在值為"str01"的常量,發明存在,則直接前往這個常量援用;
⑥履行時會在常量池中創立一個值為"str01"的常量,假如發明曾經存在,則不會創立;
第二個輸入false的緣由是:str2指向的是堆內存的"str01",而str3指向的是常量池中的"str01";
⑦履行時會在常量池創立一個值為"str01"的常量;
⑧履行時會在堆內存創立一個值為"str01"的字符串對象str5,同時在常量池創立一個"str"和"01"常量;
⑨履行時會去常量池檢查能否存在值為"str01"的常量,發明存在則直接前往這個常量援用;
第三個輸入false的緣由是:str5指向的是堆內存的"str01",而str4指向的是常量池中的"str01";
在JDK1.7下輸入成果是:
true
false
false
說明:
發明只要第一個輸入成果紛歧樣,所以我們只說明第一個的緣由:
①履行時會在堆內存創立一個值為"str01"的字符串對象str,同時在常量池創立一個"str"和"01"常量;(這點和JDK1.6沒甚麼差別)
②履行時會起首去常量池中檢查能否存在一個值為"str01"的常量,發明不存在,JDK1.7的做法就是將堆內存中"str01"的援用復制到了常量池中;
③履行時會在常量池中創立一個"str01"對象,發明曾經存在,因此不會新建;
那末此時的str和str1都將指向的是堆內存中的"str01"的值,所以二者相等;
以上就是對JDK1.6和JDK1.7中String類的intern辦法的比較,是有差異的,有須要的同伙可以參考下。