为何HashMap的键是自定义对象一定要重写equals()和hashcode

为何HashMap的键是自定义对象一定要重写equals()和hashcode,第1张

首先,我们在进行编程时,会用到HashMap,HashMap我们知道,底层原理实际上是数组加链表,而我们在赋予键值对时,如果键是String类似的东西,是没有问题的,因为String默认重写了equals()和hashcode方法,但当我们将自定义的对象作为键,如果不重写这两个方法是会出大问题的。

因为不重写系统默认是调用object,返回的是对象的内存地址,结果肯定是false,即使内容是相同的Set也不会去重,当put(key,value)时,会根据哈希算法找到自己的位置,但是当进行完哈希算法返回的是同一个值,这时会在返回值的下面增加一个链表节点(我们称为hash冲突),当遍历HashMap时,我们说即使哈希值完全相同,但对象的内容也不一定相同,这时就要重写equals()方法,因为equals()方法也是返回内存地址的(不重写会默认调用系统的equals()方法,两个对象的内存地址必不相同,返回值依然是false,Set不会去重),读者可查看equals源码。

hasgcode()方法主要是要来定位元素在数组中的下标位置

equals()方法主要是在发生hash冲突时,遍历链表,挨个比较元素,判断元素是否相等

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/728326.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存