String a = "hello";
String b = "hello";
String c = new String("hello");
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println(a == c);
System.out.println(a.equals(c));
运行结果:
true?
true
false
true
"==" 比较的解析:
String a = "hello"; ====》在栈中开辟一块内存来存储a,里面放的是“song” 的地址值(比如所0X444),在jvm常量池中存储“song”,它的地址为0X444。栈中的a指向常量池中的“song”。
String b = "hello"; ====》在栈中开辟一块内存来存储b,里面放的是“song” 的地址值(0X444),因为此时常量池中已经存在了“song”,所以就直接让b直接指向常量池中的“song”,不用重新创建一个新的“song”。
a与b这两个引用变量,它们指向同一个引用,因此返回true。
String c = new String("hello"); ====》在栈中开辟一块内存来存储c,里面放的是“song” 的地址值(比如所0X555),new一出现就表示新创建了一个对象,在堆内存中开辟出了一块新的空间存储“song”,它的地址为0X555。栈中的c指向堆中的“song”。
a与c两个引用变量,它们指向的不是同一个引用,返回false。
?"equals" 比较的解析:
equals比较的是两个引用变量的值是否相同。因此都返回true。
|