重写hashcode与equals⽅法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id &&
age == user.age &&
Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name, age);
}
Why同时重写:
官⽅约定:
在⼀个应⽤程序执⾏期间,如果⼀个对象的equals⽅法做⽐较所⽤到的信息没有被修改的话,那么,对该对象调⽤hashCode⽅法多次,它必须始终如⼀地返回同⼀个整数。在同⼀个应⽤程序的多次执⾏过程中,这个整数可以不同,即这个应⽤程序这次执⾏返回的整数与下⼀次执⾏返回的整数可以不⼀致。
如果两个对象根据equals(Object)⽅法是相等的,那么调⽤这两个对象中任⼀个对象的hashCode⽅法必须产⽣同样的整数结果。
如果两个对象根据equals(Object)⽅法是不相等的,那么调⽤这两个对象中任⼀个对象的hashCode⽅法,不要求必须产⽣不同的整数结果。然⽽,程序员应该意识到这样的事实,对于不相等的对象产⽣截然不同的整数结果,有可能提⾼散列表(hash table)的性能。equals不等于
通常情况下,当我们需要⽐较两个对象的时候,希望⽐较的是两个对象的某些值是否相等,⽽不是⽐较两个对象是否引⽤于同⼀个地址。
1
1. 不重写的情况:
当我们不重写hashcode与equals⽅法时,默认使⽤ java 提供的 java.lang.Object 下的 hashCode()和equals() ⽅法。
默认⽐较:主要是对⾮空对象的引⽤地址的判断,地址⼀致则返回true
1.1 两者关系
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
2. 只重写equals的情况:
如果我们对⼀个对象重写了equals ⽅法,意味着只要对象的成员变量值都相等那么equals 就返回true ,
但在不重写 hashcode ⽅法的情况下,当我们重新 new 了⼀个新对象。
此时,当原对象.equals(新对象)等于true时,两者的 hashcode 却是不⼀样的,由此会产⽣了理解的不⼀致,也违反了equals 与hashcode的约定规则。
2.1 不重写导致的结果案例:
在不重写hashcode的情况下,如果 hashset存储两个引⽤不同但值相同的对象,此时hashcode返回false,认为后者与前者不重复,则会重新 newNode() 创建⼀个新节点将重复的值添加到集合中,意味着不可重复的单列集合中出现了两个值⼀样的对象,导致混淆。(假设没有重写)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论