Java的Object类中提供了两个重要的方法,equals和hashCode, 在map和set中这两个方法起到了至关重要的作用,以下是使用和重写这两个方法时的约定
如果两个对象通过equals比较的结果为true, 那么它们的hashCode也必须一样
如果两个对象的hashCode相等,那么这两个对象不一定相等(即equals不一定返回true)
默认情况下,equals方法调用了==操作符,也就是说,它只会在指向同一个对象时才会返回true, 而hashCode默认是将对象的地址转化成唯一的整型数字.
在“Effective Java”有这样一条建议: 如果你重写了equals方法,那么一定要重写hashCode
错误的例子: 这里只重写了equals方法,但没有重写hashCode,这导致在这个类被用作map的key时,出现了一些不正常的情况(事实上这个是和hashMap的实现有关系的)
正确的例子,这个例子中的类继承自上面那个类,但是它重写了hashCode类,保证了当equals返回true时,hashCode也能返回相同的值,解决了上述的问题
事实上,上述问题与hashMap的内部实现有着很大的关系,关于hashMap的源码解析,请见HashMap源码解析