equals()和hashcode()都是总父类object中的方法,所有类都默认继承了object类,但是在object中的equals和hashcode()的实现都不尽如意,所以一般使用这俩个方法都需要重写.
object类中的equals()方法用的比较方法是”==”,那么就是说比较的地址,但让,如果你用equals就是用作数值的比较,那不必说了,如果不是,那么object的equals方法就不能这样用了.同样,hashcode()方法,是求调用者的hashcode值,其中怎么计算不说了,那么,如果用父类的hashcode(),比较的也是地址.
这里需要注明的是:我嫩平时用的arrays工具类,用String的equals’方法已经被重写过了,看过源码的人肯定知道,equals方法用了hashcode方法.就是说重写之后的hashcode方法对于同一对象求出的值永远是一样(这里不包括引用类型的引用改变),可以说同一个东西的哈希值一样,一样的哈希值就是同一个对象.
说下重写equals方法的思路:
1.判断是否是一个实例
2.判断是否是空
3.判断是否是一个类型
4.判断类中的属性是否相等.
public boolean equals(Object obj) {
// 第一步先判断是否同一个实例
if (this == obj) {
return true;
}
// 第二步判断要比较的对象是否为null
if (obj == null) {
return false;
}
// 第三步判断是否同一个类型
if (obj instanceof A) {
// 第四步类型相同,先转换成为同一个类型
A a = (A) obj;
// 第五步然后进行对象属性值的比较
if (this.id == a.id && this.name.equals(a.name)) {
return true;
} else {
return false;
} } else {
return false;
} }
其实正常在第五步的时候,需要用hashcode码去判断,这样更加精确,那么就是说,hashcode()必须重写,如果不重写,必然导致判断不准确.