= =:判断的是两个对象的地址是否一致
equals:关键在于Object的方法equals是否被覆盖
未覆盖:Object类中equals比较的是地址,等价于 “= =”,方法如下
public boolean equals(Object obj) {
return (this == obj);
}
覆盖:按覆盖规则来,例如String类
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类同时有个常量池的内容,会对直接赋值的这些内容放入常量池
public class Test3 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false,非同一对象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("a equals b");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
注:
- Object的equals方法容易抛空指针异常,可以通过 **确定有值的对象.equals()**来调用
- 更推荐使用Objects.equals(Object a, Object b),这样可以通过a != null来避免空指针异常
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}