1 public class Str_test { 2 3 public static void main(String[] args) { 4 5 // String pool 6 // ==比较是否是同一个引用;对于String对象的相等性用equals(),因为该方法已经被override!(Object的equals()比较就是用==判断引用是否相等) 7 // Array没有重写Object的equals(),Arrays重写过 8 String a = "he"; 9 String b = "llo"; 10 String c = "hello"; 11 String d = new String("hello"); 12 13 System.out.println(c == a + b);// false 14 System.out.println(c == a + "llo");// false 15 System.out.println(c == (a + b).intern());// true 16 System.out.println(c == (a + "llo").intern());// true 17 System.out.println(c == "he" + "llo");// true reason:c:String pool 18 // 中建立"hello" 19 // "he"+"llo"成为一个新String找到String 20 // pool存在"hello",所以相等 21 System.out.println(c == d);// false 22 23 System.out.println(c == d.intern());// true 1 24 25 System.out.println(d == d.intern());// false 2 26 27 } 28 29 }
annotation:
intern()的用法:
第一个"true"就解释了第一个疑问、intern把d的内存指向为c、所以二者相等、 字符串池中应该有两个"Hello",一个是c的引用,另外一个则是d用new出来的空间, 但使用intern后其实已经指向c的内存空间了,所以才会输出"false" 在未存在c的情况下,Stirng d = new Stirng("Hello");其实应该有两个对象,一个是创建栈中字符串池的"Hello", 另外一个是对变量"d"的指向,存在于堆内存中。用new关键字不管池中有没有都会开辟一块内存空间,只有String pool没有创建某个字符串常量时,才在池中创建该地址