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

  • Post author:
  • Post category:其他


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

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

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

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



版权声明:本文为weixin_62899124原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。