hashCode() 和 equals() 方法的作用其实一样, 都是用来对比两个对象是否相等, 都需要自己去覆写来提高对比效率和准确度, 在向 hashSet, hashMap 等底层用 hash值 判断的集合中存值时, 被存储的对象都需要覆写这两个方法.
hashCode() 方法返回一个哈希值, 可以用作对比对象, 不同的对象所产生的哈希值不同, 但并不唯一, 它是通过 hash 函数(一种算法)得到的, 同一个类的对象按照自己不同的特征尽量的有不同的哈希值, 但不表示不同的对象哈希值完全不同.
equals() 方法返回一个 boolean值, 在不进行覆写的情况下会直接对比对象的内存地址, 在覆写的情况下则会根据覆写的对比规则进行对比.
既然 hashCode() 和 equals() 都是用来对比对象是否相等的, 那什么时候使用 hashCode(), 什么时候使用 equals() 呢?
首先 equals() 方法的对比规则是由自己去覆写的, 对比规则相对复杂全面, 所以导致效率较低, 而 hashCode() 则直接去用其生成的 hash值 进行比较, 效率很高, 但是 hash值 并不是完全可靠, 有时不同的对象生成的 hash值 也会相同, 所以可以得出结论: 在覆写 equals() 方法时, 也会同时覆写 hashCode() 方法, 每当需要对比的时候, 先用 hashCode() 去对比, 如果 hashCode() 不同, 则表示这两个对象肯定不相同, 所以就不需要再用 equals() 进行对比. 如果 hashCode() 相同, 那再去用 equals() 进行比较, 如果 equals() 也相同, 那表示这两个对象是真的相同了. 这样在大大提高数据对比效率的同时也保证了对比的准确性.
网友评论