首先,hashCode和内存地址没关系。
equals的定义是当两个对象等价时返回真,否则返回假。equals的实现通常要对比两个对象中的所有成员变量。如果某些成员变量为容器或对象,则也需要判断两个对象中的容器或对象是否相等。通常来说这是一个代价比较高的操作。
而hashCode的作用是用于hashMap和hashSet中确定存储位置以及在大规模等价比较中完成初筛(比如去重),其定义是当两个对象等价时必然有相等的hashCOde,不等价时尽量拥有不同的hashCode。在去重时,如果没有hashCode,那么需要进行n(n-1)/2次equals,而如果有了hashCode,就只需要进行n次hashCode和n(n-1)/2次int相等判断,然后在hashCode相等时再进行equals比较。效率会高得多。
hashCode的生成方式可以自己决定,可以是所有变量处理为数字后的和,可以是所有变量合并后md5再转为int。也可以是其中部分变量处理后的结果。总之hashCode的实现原则是保证两个equals为真的对象hashCode相同的前提下,使得equals为假的对象hashCode尽可能不同,同时还要提高hashCode自身的执行效率。