首页 > 试题广场 >

为什么重写equals还要重写hashcode?

[问答题]
请你解释为什么重写equals还要重写hashcode?
  • 如果两个对象相同,则他们的哈希值(hashcode)一定相同
  • 如果两个对象的哈希值相同(hashcode)相同,并不意味着他们是相同的
  • 对于使用Hash散列方式存储对象的数据结构:HashSet、HashMap、HashTable等,仅仅重载equals方法可能会导致实际业务逻辑失败
  • 在比较两个对象时,仅重载hashCode方法并不能强制Java忽略内存地址

举例HashMap,hashcode用来确认在数组的哪个位置,equals用来判断对象是否相等(新元素则加入链表头部)
hashcode-equals

发表于 2019-04-02 09:52:43 回复(0)
重写了equals()方法,而你的对象可能会放入到散列(HashMap,HashTable或HashSet等)中,那么还必须重写hashCode(), 如果你的对象有可能放到有序队列(实现了Comparable)中,那么还需要重写compareTo()的方法。
发表于 2018-12-23 22:49:03 回复(0)

equals():判断两个对象的内存地址是否相等
hashcode(): 根据两个对象的内存地址生成的hash码是否相等

可以用一个形象的比喻,hashCode是equals(原图)的缩略图,查hashCode的比较快,所以很多集合类HashMap等使用对象的hashCode先去判断对象是否相等,再通过equals判断,这样效率比较高。
所以如果我们不重写hashCode(),在这些集合的操作中就会出问题。
发表于 2019-11-18 15:03:54 回复(0)
如果只重写了equals,比如在hashmap中存入自定义类时候,会出现两个对象equals为true,而hashcode不同,但是hashmap中是先用hashcode来查找的,所以有可能将这两个对象视为不同;所以重写equals时候一定要重写hashcode
发表于 2019-11-05 17:23:54 回复(0)
1、如果两个对象相同(即equals返回true) ,hashcode一定相等;但是hashcod相等时,两个对象却不一定equals 2、由于为了提高程序的执行效率才实现了hashcode方法,先进行hashcode比较,如果不同,就没有必要进行equals比较了,这样就大大的减少了equals的使用次数,从而效率得到提高
发表于 2019-04-30 22:37:12 回复(0)
1、如果两个对象相同(即equals返回true) ,hashcode一定相等;但是hashcod相等时,两个对象却不一定equals 2、由于为了提高程序的执行效率才实现了hashcode方法,先进行hashcode比较,如果不同,就没有必要进行equals比较了,这样就大大的减少了equals的使用次数,从而效率得到提高
发表于 2019-03-08 16:10:41 回复(1)

https://blog.csdn.net/kangkanglou/article/details/78954894

主要是基于哈希机制的考究

发表于 2018-12-13 10:38:19 回复(0)
HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两个对象,比较也是不相等的。HashMap中的比较key是这样的,先求出key的hashcode(),比较其值是否相等,若相等再比较equals(),若相等则认为他们是相等的。若equals()不相等则认为他们不相等。如果只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为同一对象(即进行内存地址的比较),所以必定要两个方法一起重写。HashMap用来判断key是否相等的方法,其实是调用了HashSet判断加入元素 是否相等。重载hashCode()是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上。重载equals()是为了向HashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对。
发表于 2019-04-30 21:41:59 回复(1)
说些题外话,我想问一下:为什么你问的问题为什么会这么loser?为什么重写了equals方法就一定要重写hashCod?难道不是问:在什么情况下应该重写hashCod?


发表于 2019-10-19 21:19:59 回复(1)
如果equals相同返回true的话那么他们hashcode值一定相同
发表于 2019-04-25 16:15:03 回复(0)
equals方法定义了如何比较值,在单个遍历比较时回达到期望的结果;但是如果对象被放入Hash容器如HashSet、HashMap、HashTable中,这些容器是通过调用对象的hashcode函数来比较的。
发表于 2019-03-21 21:46:00 回复(0)