一篇搞懂==,===,equals()
==
==是比较运算符,==比较的是对象的地址,也就是判断是否为同一个对象;
或者这么说吧:
当比较基本数据类型时,==就是比较值是否相等
当比较引用数据类型时,例如比较两个对象的引用时,==比较的就是引用变量的地址是否相同
===
“===”一般在JS中使用,用于判断左右两个操作数是否严格相同,比较原则比“==”更严格,“===”既比较内容,又比较数据类型。
这里主要注意两点:
(1)如果类型不同,就一定不相等(返回false)
(2)如果比较对象中有至少一个是NaN,那么一定不相等。(判断一个值是否是NaN,只能使用isNaN( ) 来判断)
其他情况下(如字符串、null、undefined、数值型等)就是判断左右两侧是否数据类型相同并且数据值完全相同。
equals()
equals()是方法,不是运算符。在Java中,所有类都继承了Object类。而在Object类中,equals()方法是这么定义的
//equals方法的实现原理
public boolean equals(Object obj) {
return (this == obj)
}
其实,在原生的Object类中,equals()方法的实现也是依靠"=="实现的,所以原生的equals()和"=="并无差别。
但是很多类都会重写equals()方法,重写之后equals()方法就不和"=="相同了,例如在String.java源文件中,String类的equals()方法重写如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
在String类中,equals()方法判断条件如下:
1)若当前对象和比较的对象是同一个对象(用"=="判断的),即返回true。实际上这就是Object中的equals方法。
2) 若当前传入的对象是String类型,则比较两个字符串的长度(value.length)。若长度不相同,返回 false。若长度相同,则按照数组value中的每一位进行比较,每一位都相同返回true,有不同时返回false。
3)若当前传入的对象不是String类型,则直接返回false。
所以最终重写后,equals()方法比较的其实是值(内容)是否相等,而不是内存地址是否相等了。除了String以外,Java中大部分类都重写了equals方法,比如包装类Integer,Double,Long等。
在我们日常使用中,如果要比较两个引用是否指向同一个对象(内存地址是否相同),应该用 "==" 比较 ,如果想比较内容是否相等可以尝试使用equals()方法,当然可以自己重写equals()方法,自己写的话可以更符合自己的需求变化,想怎么比就怎么比。
== 和equals()的区别
5.1 比较八种基本数据类型时,要使用"==",不能用equals(),此时“==”比较的是左右两边的值是否相等。
八种基本数据类型:byte、int、short、long、char、float、double、boolean
5.2 比较包装类型时,“==” 比较的是内存地址是否相等,而equals()比较的是值是否相等(在日常使用中最常用到比较String是否相等,这里要用equals方法去比,不能用"==")。
实例
举一些例子便于理解。
String s1 = "RoRoBear";
String s2 = "RoRoBear";
String s3 = "RoRoBea";
String s4 = "r";
String s5 = s3 +s4;
String s6 = s3+"r";
String s7 = new String("RoRoBear");
String s8 = new String("RoRoBear");
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
System.out.println((s1 == s5)); //false
System.out.println(s1.equals(s5)); //true
System.out.println(s1 == s6); //false
System.out.println(s1.equals(s6)); //true
System.out.println(s1 == s7); //false
System.out.println(s1.equals(s7)); //true
System.out.println(s5 == s6); //false
System.out.println(s5.equals(s6)); //true
System.out.println(s5 == s7); //false
System.out.println(s5.equals(s7)); //true
System.out.println(s7 == s8); //false
System.out.println(s7.equals(s8)); //true