第一个是true其余的都是false。
== 你去查看下java.lang.object类的equals方法,==是比较内存地址是否相同,或者比较基本类型的值是否相同,比如:
1 == 1比较的是2个基本类型的值
对象1 == 对象2 比较是2个对象在内存中的地址的引用是否是同一个,说白了就是比较是否引用了相同对象,即是否是同一个对象。说这个可以延伸到更深层次,呵呵慢慢研究吧,你可以关注下hashcode 和equals方法对于这个的延伸
== 你去查看下java.lang.object类的equals方法,==是比较内存地址是否相同,或者比较基本类型的值是否相同,比如:
1 == 1比较的是2个基本类型的值
对象1 == 对象2 比较是2个对象在内存中的地址的引用是否是同一个,说白了就是比较是否引用了相同对象,即是否是同一个对象。说这个可以延伸到更深层次,呵呵慢慢研究吧,你可以关注下hashcode 和equals方法对于这个的延伸
想知道结果,读JVM源码比较好。想通过测试的方式来猜测实现,比较难。
false
false第一个true的原因是:first和second都会放在jvm的常量区,而且重复定义的常量会合并为一个,所以,first和second指向的地址相同。
第二个和第三个false的原因是:他们都分别指向各自的放在堆区里的不同对象,所以==判断是不同的。
先说理论: 用'String X = "X" ;方式 声明先去找字符常量池有没有这个引用,有的话就直接给引用地址给栈里的字面值X;
用NEW 方式声明则不会去找,直接在堆内存NEW类.把新建的类的引用地址给栈里的字面值X;
String first = "Phone:" + "55555";
String second = "Phone:" + 55555; //true,找了字符常量池,所以为真
String third = new String("Phone:") + new String("55555"); //false,new 方式没找字符常量池,所以为假
String fourth = new String("Phone:") + 55555; //false,new 方式,没找字符常量池,所以为假