java中的“==”和equals 相信一直纠结这很多初学者;他们到底是怎么一回事,到底有什么区别?你总会感觉你刚弄懂点,然后出来一个题,又失败了,要彻底弄清楚他们之间的运行机制,最好的办法就是看他们的源码和API说明,首先大家看一下下面的这段代码:
(1)String s1 = "Monday";
String s2 = "Monday";
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}
编译并运行程序,输出:s1 == s2
(2) String s1 = "Monday";
String s2 = "Monday";
if (s1.equals(s2))
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}
编译并运行程序,输出:s1 == s2
(3) String s1 = new String("Monday");
String s2 = new String("Monday");
String s3="Monday";
if (s1 == s2){
System.out.println("s1 == s2");
}else{
System.out.println("s1 != s2");
}if(s1 == s3){
System.out.println("s1 == s3");
}else {
System.out.println("s1 != s3");
}
}
编译并运行程序,输出:s1 != s2; s1!= s3
(4) String s1 = new String("Monday");
String s2 = new String("Monday");
String s3="Monday";
if (s1.equals(s2)){
System.out.println("s1 == s2");
}else{
System.out.println("s1 != s2");
}if(s1.equals(s3)){
System.out.println("s1 == s3");
}else {
System.out.println("s1 != s3");
}
}
编译并运行程序,输出:s1 == s2;s1 == s3
(5) Manager m1 = new Manager("jack",1400,"1994-5-8","NEC");
Manager m2 = new Manager("jack",1400,"1994-5-8","NEC");
if (m1.equals(m2))
System.out.println("m1 == m2");
else
System.out.println("m1 != m2");
编译并运行程序,输出:m1 != m2
(6) Manager m1 = new Manager("jack",1400,"1994-5-8","NEC");
Manager m2 = new Manager("jack",1400,"1994-5-8","NEC");
if (m1==m2)
System.out.println("m1 == m2");
else
System.out.println("m1 != m2");
编译并运行程序,输出:m1 != m2
解析:对于(1)没有“new“一个对象,所以对象Monday放在字符串常量池里面,s1和s2指向的是同一个对象。==表示的是对象的地址,也就是变量值,所以他们做判断是值为true。
对于(2)同样没有new,只不过是equals,它比较的是变量指向的对象的值是否相等,显然是相等的,所以他们的判断值也为true。
对于(3)new两个了对象,该对象放在内存的堆中,表示两个不同的对象,因此他们栈中的地址肯定也是不一样的,所以判断值为假;
对于(4)new了两个对象,因为equals比较两个对象的值,所以他们的判断也是true。
对于(5)new了两个对象,同3!
对于(6)这时,你可能蒙了,equals不是比较对象值吗,为什么现在不相等了呢?现在的它跟==毫无区别,比较的是地址。所以判断值也为假。
总结:相信你看了上面的有点蒙了,现在来个总结你就会了:
(1)== 比较的是2个对象的地址,只要new了两个对象,那么他们的地址肯定不一样,对于String类,可以不new,这时他们的对象放在字符串常量池,内容相等的话,就是同一个对象,地址也就想同。
(2)equals:两种情况:a 如果类型是String类,那么他比较的就是对象的值是否相同,只要对象的值相同,不管new没有new,做判断他们的值都为真,这时因为它覆盖了object类里的equals方法。b 如果不是String类型,那么它的功能就和==一样,比较的是对象的地址是否相同,如上面的(5)。
(1)String s1 = "Monday";
String s2 = "Monday";
if (s1 == s2)
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}
编译并运行程序,输出:s1 == s2
(2) String s1 = "Monday";
String s2 = "Monday";
if (s1.equals(s2))
System.out.println("s1 == s2");
else
System.out.println("s1 != s2");
}
}
编译并运行程序,输出:s1 == s2
(3) String s1 = new String("Monday");
String s2 = new String("Monday");
String s3="Monday";
if (s1 == s2){
System.out.println("s1 == s2");
}else{
System.out.println("s1 != s2");
}if(s1 == s3){
System.out.println("s1 == s3");
}else {
System.out.println("s1 != s3");
}
}
编译并运行程序,输出:s1 != s2; s1!= s3
(4) String s1 = new String("Monday");
String s2 = new String("Monday");
String s3="Monday";
if (s1.equals(s2)){
System.out.println("s1 == s2");
}else{
System.out.println("s1 != s2");
}if(s1.equals(s3)){
System.out.println("s1 == s3");
}else {
System.out.println("s1 != s3");
}
}
编译并运行程序,输出:s1 == s2;s1 == s3
(5) Manager m1 = new Manager("jack",1400,"1994-5-8","NEC");
Manager m2 = new Manager("jack",1400,"1994-5-8","NEC");
if (m1.equals(m2))
System.out.println("m1 == m2");
else
System.out.println("m1 != m2");
编译并运行程序,输出:m1 != m2
(6) Manager m1 = new Manager("jack",1400,"1994-5-8","NEC");
Manager m2 = new Manager("jack",1400,"1994-5-8","NEC");
if (m1==m2)
System.out.println("m1 == m2");
else
System.out.println("m1 != m2");
编译并运行程序,输出:m1 != m2
解析:对于(1)没有“new“一个对象,所以对象Monday放在字符串常量池里面,s1和s2指向的是同一个对象。==表示的是对象的地址,也就是变量值,所以他们做判断是值为true。
对于(2)同样没有new,只不过是equals,它比较的是变量指向的对象的值是否相等,显然是相等的,所以他们的判断值也为true。
对于(3)new两个了对象,该对象放在内存的堆中,表示两个不同的对象,因此他们栈中的地址肯定也是不一样的,所以判断值为假;
对于(4)new了两个对象,因为equals比较两个对象的值,所以他们的判断也是true。
对于(5)new了两个对象,同3!
对于(6)这时,你可能蒙了,equals不是比较对象值吗,为什么现在不相等了呢?现在的它跟==毫无区别,比较的是地址。所以判断值也为假。
总结:相信你看了上面的有点蒙了,现在来个总结你就会了:
(1)== 比较的是2个对象的地址,只要new了两个对象,那么他们的地址肯定不一样,对于String类,可以不new,这时他们的对象放在字符串常量池,内容相等的话,就是同一个对象,地址也就想同。
(2)equals:两种情况:a 如果类型是String类,那么他比较的就是对象的值是否相同,只要对象的值相同,不管new没有new,做判断他们的值都为真,这时因为它覆盖了object类里的equals方法。b 如果不是String类型,那么它的功能就和==一样,比较的是对象的地址是否相同,如上面的(5)。