首先 equals( ) 是 Object 中的方法,默认是用 = = 来比较的。hashCode( ) 也是 Object 类的方法,根据一定的规则将与对象相关的信息,比如对象的内存地址,映射成一个数值,这个数值称作为哈希值。
有时候我们想要自定义类的比较规则时,需要重写 equals( ),但是为了保证类在 HashSet 和 HashMap 等集合中的正确存储,也要同时重写 hashCode( ) 。
以 HashMap 为例, HashMap底层在添加相同的元素时,会先调用两个对象的 hashCode( ) 是否相同,如果相同还会再用 equals( ) 比较两个对象是否相同。
假设有一个 Person 类,有 name 和 age 两个字段,我们现在重写 equals( ) 规定只有两个 Person 的 name 和 age 都相同时,才认为两个 Person 相等。现在 new 出两个 name 和 age 都相同的 Person,分别添加到 HashMap 中。
我们期望最后 HashMap 中只有一个 Person,但其实是有两个。原因在于添加第二个 Person 时,先比较的是两个 Person 的 hashCode( ),注意此时我们没有重写 hashCode( ) ,那么分别 new 出来的 Person 的哈希值肯定是不同的,到这里 HashMap 就会将两个 Person 认定为不同的元素添加进去。
解决的办法就是重写 hashCode( ),最简单的返回 name 和 age 的哈希值的乘积即可。