随便写一个类
package com.test1;
public class AB {
int x = 10;
}
这个类里面什么也没有,除了一个default类型的属性x
然而当我们用eclipse实例化一个AB的对象aa,然后用aa去“点”一下的时候,会自动跳出许多方法,第一个就是equals()
也就是说,这些方法就像构造方法一样,是系统默认给每个类配置好的方法。
(实际上,任何一个类如果没有继承其他类都是默认继承Object类,而上述“默认”的方法就是在Object中实现,这里直接继承而来)
那么我来看看equals()方法。
在学习String的时候,老师特别说过,字符串的比较要用equals不要用“==”
因为equals比较的才是字符串的值,==比较的是地址!
String a1 = "123";
String b1 = "123";
String a2 = new String("123");
String b2 = new String("123");
//“ == ”比较的是地址
System.out.println("b1 == a1 ? " + (b1==a1));//true
System.out.println("b2 == a1 ? " + (b2==a2));//false
//而equals()比较的是内容
System.out.println("b1 == a1 ? " + b1.equals(a1));//true
System.out.println("b2 == a1 ? " + b2.equals(a2));//true
a1、a1、b1、b2四个对象的值都是一样的,但是a1和b1的地址相同(常量“123”被分配一次内存,地址相同)而a2、b2的地址不一样。
上面回顾了equals的作用,但是正如我们知道的,系统默认的构造方法是不干事的,那么每个类默认的equals()方法呢?
AB aa = new AB();
AB bb1 = new AB();
AB bb2 = aa;
System.out.println(bb1.equals(aa));//false
System.out.println(bb2.equals(aa));//true
显然,很可惜,系统默认的equals()方法比较的是地址而不是值!
正如我们可以自己写构造方法其“屏蔽”系统的方法,我们也可以自己写equals()方法去“屏蔽”系统自带的equals()方法
eclipse提供自带的equals()方法的写法,只需在要写equals()方法的类界面按Alt+Shift+S快捷键(或者鼠标右键找到Sourse)
然后点击Generate hashCode() and equals()即可
equals()方法所需代码:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AB other = (AB) obj;
if (x != other.x)
return false;
return true;
}
然后系统将自动生成equals()方法,自己写了这个方法后再去运行之前的代码就会发现结果不一样了
//自己写了equals()方法之后
AB aa = new AB();
AB bb1 = new AB();
AB bb2 = aa;
System.out.println(bb1.equals(aa));//true
System.out.println(bb2.equals(aa));//true