一 HashCode作用
1.1 HashCode作用
hashCode是object类的一个方法,用于哈希表结构,主要是用来获取哈希值,用于确定对象在哈希表中的位置,如果两个对象的hashcode相同,那么他们可能被放在哈希表同一个位置(这取决于哈希表的实现)。
当我们在进行对象比较时,如果两个对象内容相等(即equals()方法返回true),那么它们的hashCode()也必须相等。
https://mp.weixin.qq.com/s/1875v3H9v7KK0KodeBPDhQ
1.2 重写equals()的时候为何必须重写hashcode()
每次重写equals()方法时,hashCode()方法也需要重写,就是为了保证:如果两个对象调用equals()方法返回的结果为true,那么两个对象调用 hashCode()方法返回的结果也必然相同。
如果重写equals()时没有重写 hashCode()方法的话就可能会导致 equals 方法判断是相等的两个对象,hashCode 值却不相等。
https://blog.csdn.net/weixin_66196770/article/details/136877179
1.3 案例
如果两个对象调用equals()方法得到的结果为true,调用hashCode()方法得到的结果必定相等。
System.out.println("AA".hashCode());//2080 |
如果两个对象调用hashCode()方法得到的结果相等,调用equals()方法得到的结果不一定相等。
System.out.println("Aa".hashCode());//2112 |
Java 中的 hashCode_java hashcode-CSDN博客
结论:两个对象的hashCode值相等并不代表两个对象就相等。
1.4 hashset原理
Hashset的底层是hashmap数据结构,hashset在添加元素时,调用add方法,使用hashcode()与equals()两个方法确定唯一性。原理如下:
hashCode方法返回的就是一个哈希码值,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的位置上。
如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;
如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。
这样一来实际调用equals方法的次数就大大降低了,相应就大大提高了执行速度。
如果两个对象的hashCode值相等,那这两个对象不一定相等(哈希碰撞)。
如果两个对象的hashCode值相等并且equals()方法也返回 true,我们才认为这两个对象相等。
如果两个对象的hashCode值不相等,我们就可以直接认为这两个对象不相等。