程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java String的intern辦法

java String的intern辦法

編輯:關於JAVA

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辦法的比較,是有差異的,有須要的同伙可以參考下。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved