一、==
和 equals
==
在比较两个基本数据类型的时,比较的是两个基本类型的值。如果比较的是两个对象比较的是两个对象的地址。
equals
是 Ojbect 中的方法,在 Java 中所有的类都继承自 Object ,所以所有类都有 equals
方法,来看一下 Object 中 equals 方法
public class Object {
public boolean equals(Object obj) {
return (this == obj);
}
}
通过上述代码能够看到,在 Object 中 equals 等价于 ==
不过通常 equals 在类中会被重写,比如:String
String equals 方法相关代码如下:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
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 ,对比的对象都要是字符串,两个字符串地址相同,或者值相同,就认定两个 String 相同。
再来看下 Integer 中的 equals,代码如下
public final class Integer extends Number implements Comparable<Integer> {
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
}
Integer equals 进行对比判断很直接,对比的对象都要是 Integer ,且两个 Integer 对象值相等,这时候才认定两个 Integer 对象相等。
二、总结
==
和 Object#equals
是等价的,它们对比两个对象都是比较两个对象的地址是否相等,以此来判断两个对象是否相等。
不过 ==
不一定等价于 其他类的 equals ,因为 equals 通常会被重写,而是否等价,取决于重写后的代码实现。