测试环境JDK1.8测试
常量池能够存放引用,也能够存放常量spa
判断这个常量是否存在于常量池。
若是存在
判断存在内容是引用仍是常量,
若是是引用,
返回引用地址指向堆空间对象,
若是是常量,
直接返回常量池常量
若是不存在,
将当前对象引用复制到常量池,而且返回的是当前对象的引用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
String a1 = "AA";
String a2 = new String("A") + new String("A");
String a3 = new String("AA");
String a4 = new String("A") + new String("A");//只在堆上建立对象AA a4.intern();//将该对象AA的引用保存到常量池上
String a5 = new String("A") + new String("A");//只在堆上建立对象 a5.intern();//在常量池上建立引用 String a6 = "AA";//此时不会再在常量池上建立常量AA,而是将a5的引用返回给a6 System.out.println(a5 == a6); //true
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