hashCode和equals方法的区别与联系

hashCode和equals方法主要和映射(Map接口)相关. 我们知道Map接口的类会使用到键(Key)的哈希码, 当我们调用put()/get()方法操作Map容器时, 都是根据Key的哈希码来计算存储位置的, 因此如果我们对哈希码的获取没有相关保证, 就可能会得不到预期的结果.

hashCode就是哈希码(或者散列码), 是由对象导出的一个整型值, 哈希码是没有规律的, 如果x与y是两个不同的对象, 那么x.hashCode()与y.hashCode()就不会相同 —— 只要x和y对象没有重写hashCode()方法, JVM规范中明确要求它们的散列码不会相同.

String(字符串)的哈希码是由字符串的内容导出的, 也就是String类中重写了hashCode()方法.

HashCode

    1、map的数据结构是数组+链表的结构(jdk1.8是数组+链表+红黑树),hashcode用来定位数组下标索引,找到对象存放的桶,然后遍历桶内链表、树,找到对应的元素。

    2、Object默认的hashcode实现对于不同的对象会返回不同的值,因为是根据内存来得到的hashcode,因此,在上面那个例子中,不同的对象(即使同一个类型)有着不同的hashcode;

    3、相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的

    4、hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

    5、在set存储的是不重复的对象,而判断对象是否相等是调用的hashCode和equals进行判断的,所以,如果要判断两个对象逻辑上的不相等,那就必须重写这两个方法。

    所以在向set中添加对象时,必须重新这两个方法,且一般情况下,这两个方法要一起重写。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容