package io.openmessaging.storage.dledger;
public class T {
public static void main(String[] args) {
/*
* String str = new String("a"); //产生常量a ,堆上的new String
* str = str.intern(); //找到常量池的a
*
* String str2 = "a"; //常量池中的a
*
* System.out.println(str == str2);
*/
/*String s5 = new String("hi") + new String("j");
s5.intern();
String s6 = "hij";
// s5 == s6 ? true
System.out.println(String.format("s5 == s6 ? %s", s5 == s6));*/
String s5 = new String("hi") + new String("j"); //产生两常量hi,j 堆上的new String
s5.intern(); //将s5的引用加入常量池
String s6 = "hij";//s6指向s5
s6 = s6.intern();
// s5 == s6 ? true
System.out.println(String.format("s5 == s6 ? %s", s5 == s6));
String s7 = new String("hij");
s7 = s7.intern();
System.out.println(String.format("s5 == s6 ? %s", s5 == s7));
String s = "zzn" + 2L;
String s2 = "zzn" + 2L;
System.out.println(s == s2);
String s3 = "zzn" + 222222L;
String s4 = "zzn" + 222222L;
System.out.println(s3 == s4);
System.out.println(add(44444L) == add(44444L));
System.out.println(add2(44444L) == add2(44444L));
}
public static String add(Long l) {
return "zz"+l;
}
public static String add2(Long l) {
return ("zz"+l).intern();
}
}
s5 == s6 ? true
s5 == s6 ? true
true
true
false
true
总结:
jdk1.6:
str.intern()返回常量池对象
jdkl1.8:
str.intern();
当str是常量String str="a”,此时常量池中不存在常量或者引用,那么将常量“a”加入常量池。如果常量池中存常量或者引用,那么str指向常量池中的常量或者引用。
当str是指向堆中的引用String str=new String("hi") + new String("j"),此时常量池中不存在常量或者引用,那么将常量“hij”得引用str加入常量池。 如果常量池中存常量或者引用,那么str指向常量池中的常量或者引用。
常量池只会保留一份,要么是常量,要不是指向堆中的引用