public static void main(String[] args){
String a=new String("ddy");
String b=new String("ddy");
System.out.println("a:"+a.hashCode());
System.out.println("b:"+b.hashCode());
System.out.println("equals:"+(a.equals(b)));
System.out.println("a==b:"+(a==b));
}
输出为:
a:99321
b:99321
equals:true
a==b:false
String a = new String("段丁阳")创建了两个对象,一个是在常量池中,一个是在堆内存中,常量池的为"ddy";堆内存中为new String();而该对象又指向在常量池中的字符串常量。
而a==b比较的正是new String()的内存地址,a的new String()与b的new String()内存地址显然是不同的,所以a==b返回false
但是a.hashCode与b.hashCode相等,hashCode并不能代表内存地址
String a = "aa";与String a = new String("aa");最根本的区别是:
String a = "aa";创建了一个字符串变量。a 是指向栈中的"aa";
而String a = new String("aa");创建的是一个对象。a 是指向堆中"aa"的地址。