上午10:14
Equals 与 ==
- equals比较两个对象的内容是否相等
- ==比较两个声明对象是否引用内存中的同一对象
- object中的equals用的是==
hashcode 约定
- 应用运行期间,对象内容未修改,多次执行hashcode返回相同int值,多次执行同一应用,不强制要求返回相同整数值
- 两个对象equals方法相等,hashcode方法返回值必须相等
- 两个对象equals方法返回值不相等,不要求两个对象的hashcode方法必须不相等
Equals重写规则
- 自反性 非null的x,x.equals(x)应返回true
- 对称性 非null的x和y, x.equals(y),必须y.equlas(x)也返回true
- 传递性 x.equals(y)=true, y.equlas(x)=true,即x.equals(z)=true
- 一致性 对象未被修改,多次调用equals方法,始终返回相同结果
重写equals为什么必须重写hashcode?
- hashcode方法约定 ,equals方法相等,必须hashcode方法返回值也相等,如果不重写hashcode方法,hashcode仍然采用继承自object类的hashcode方法,比较的是内存引用,就会导致equlas相等,hashcode不相等的情况发生
- hashmap 在put数据时,判断两个key是否相等,先判断hash值,再判断equals值, hash 值判断起来高效一些,所以放置在前边进行判断,hash值不相等,equals必然不相等
equals重写建议
- 显式命名otherObject
- 判断是否==,如果相等,直接返回true
- 检测otherObject是否为null,为null则返回false
- 比较this与otherObject是否属于同一类
- 如果equals语义在每个子类中有所改变,就使用getClass检测,if(getClass()!=otherObject.getClass()) return false
- 如果子类对于equals有统一语义,就用instanceOf检测, if (!(otherObject instanceOf ClassName)) return false
- 将otherObject转换为相应的类类型变量: Class Name other = (ClassName)otherObject
- 对各个域进行比较,==比较基本类型域,使用equals比较对象域,所有域都匹配就返回true
- 子类中重新定义equals,就要在其中包含调用super.equals(other)
- equals重写必须重写hashcode