String intern()

前言

測試環境JDK1.8測試

常量池能夠存放引用,也能夠存放常量spa

 

String.intern()分析

 判斷這個常量是否存在於常量池。
  若是存在
   判斷存在內容是引用仍是常量,
    若是是引用,
     返回引用地址指向堆空間對象,
    若是是常量,
     直接返回常量池常量
  若是不存在,
   將當前對象引用複製到常量池,而且返回的是當前對象的引用code

    String a1 = "AA";
    System.out.println(a1 == a1.intern()); //true
    String a2 = new String("B") + new String("B");
    a2.intern();
    String a3 = new String("B") + new String("B");
    System.out.println(a2 == a3.intern());//true
    System.out.println(a3 == a3.intern());//false
    String a4 = new String("C") + new String("C");
    System.out.println(a4 == a4.intern()); //true

三.總結

 

1.只在常量池上建立常量

    String a1 = "AA";

2.只在堆上建立對象

    String a2 = new String("A") + new String("A");

3.在堆上建立對象,在常量池上建立常量

    String a3 = new String("AA");

4.在堆上建立對象,在常量池上建立引用

 
    String a4 = new String("A") + new String("A");//只在堆上建立對象AA
    a4.intern();//將該對象AA的引用保存到常量池上

5.在堆上建立對象,在常量池上建立引用, 在常量池上建立常量(不可能)

    String a5 = new String("A") + new String("A");//只在堆上建立對象
    a5.intern();//在常量池上建立引用
    String a6 = "AA";//此時不會再在常量池上建立常量AA,而是將a5的引用返回給a6
    System.out.println(a5 == a6); //true

6.

 

四.練習

         String aa = "AA";//設置常量AA到常量池
         String bb = "BB";//設置常量BB到常量池
         String ccdd = "CC"+"DD";//設置常量CCDD到常量池
         String neeff = new String("EE")+new String("FF");//設置EE和FF到常量池。而且添加EE、FF和EEFF對象到堆
         String aabb = aa+bb;//添加AABB對象到堆
         String gghh = "GG"+new String("HH");//設置GG和HH常量到常量池,設置HH和GGHH對象到堆
//         aa.intern();//啥事都不作,返回AA常量
//         ccdd.intern();//啥事都不作,返回CCDD常量
//         neeff.intern();//添加EEFF對象的引用到常量池,並返回EEFF對象
//         aabb.intern();//添加AABB對象的引用到常量池,並返回AABB對象
//         gghh.intern();//添加GGHH對象的引用到常量池,並返回GGHH對象
         System.out.println(aa.intern()==aa); //true
         System.out.println(neeff.intern()=="EEFF");//true
         System.out.println("EEFF"==neeff);//true
         String nccdd = new String("CCDD");
         System.out.println(ccdd==nccdd);//false
         System.out.println(ccdd==nccdd.intern());//true
         System.out.println(aabb.intern()==aabb);//true
         System.out.println(gghh==gghh.intern());//true
相關文章
相關標籤/搜索