hashCode和equals作用
hashCode和equals作用实际上差不多,都是用来比较两个对象是否相同。但是equals比较更加全面准确,所以比较复杂,这样效率很低,所以我们还要使用hashCode生成一个值,如果值不同则认为两个对象不同,这样可以提高效率。当hashCode与equals都判断相同时,我们认为这两个对象是重复对象。
hashCode和equals关系
这里通过代码来了解hashCode和equals的关系
public class Worker {
String name;
int salary;
public Worker(String name, int salary) {
super();
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "Worker [name=" + name + ", salary=" + salary + "]";
}
@Override
public int hashCode() {
System.out.println("hashCode");
return salary;
}
@Override
public boolean equals(Object obj) {
System.out.println("equals");
Worker w = (Worker) obj;
return name.equals(w.name);
}
public static void main(String[] args) {
HashSet<Worker> set = new HashSet<>();
Worker w1 = new Worker("张三", 5000);
Worker w2 = new Worker("张三", 6000);
Worker w3 = new Worker("张三", 5000);
Worker w4 = new Worker("李四", 5000);
set.add(w1);
set.add(w2);
set.add(w3);
set.add(w4);
Iterator<Worker> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
运行结果:
为了方便我把Worker类中的salary属性作为hashcode值返回,equals比较两对象的姓名是否相同。
从运行结果可以看出,当往HashSet集合中添加元素时会先调用hashCode方法获取hash值,如果集合中没有元素的hash值与这个值相同,则认为这个元素没有重复,便不会再调用equals方法,上面的结果中w2的salary值与w1的不同,所以并没有继续调用equals方法;当hash值与集合中的其他元素出现重复,这个时候才会调用equals方法,上面的结果中,w4的salary值与集合中的其他元素重复所以调用了equals方法与其他元素比较name是否相同。上面的结果中,w3的salary与name与w1都相同,hashCode与equals都判断为相同,所以没有加入到集合中。
结论:
当hashCode判断相同时,equals判断未必相同
当equals判断相同时,hashCode判断一定相同
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)