API中:当String调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 调用之后就返回一个String类型,然后去常量池中寻找,如果有就直接返回池中的字符串。
String s = new String("abc");
String s1 = "abc";
String s2 = new String("abc");
String s3 = new String(new String("abc"));
虽然上面四个的地址值都不同,而且s1中的"abc"就在常量池。
System.out.println( s == s1.intern() );s1.intern() 就是常量池的"abc",而s是在堆内存中new的一个对象,所以为false;
System.out.println( s == s2.intern() );和上面一样s2.intern()之后也是量池的"abc",所以false;
System.out.println( s1 == s2.intern() );s2.intern()之后也是量池的"abc",s1中的"abc"就在常量池,所以都是同一个,所以true;
System.out.println( s1 == s3.intern() );同上,
System.out.println( s.intern() == s3.intern() );同上,
|