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没有创建某个字符串常量时,才在池中创建该地址