首页 > 试题广场 >

hashCode()和equals()方法的重要性体现在什么

[问答题]
hashCode()和equals()方法的重要性体现在什么地方?
hashcode和equals组合在一起确定元素的唯一性。
查找元素时,如果单单使用equals来确定一个元素,需要对集合内的元素逐个调用equals方法,效率太低。因此加入了hashcode方法,将元素映射到随机的内存地址上,通过hashcode快速定位到元素(大致)所在的内存地址,再通过使用equals方法确定元素的精确位置。
比较两个元素时,先比较hashcode,如果hashcode不同,则元素一定不相等;如果相同,再用equals判断。
HashMap采用这两个方法实现散列存储,提高键的索引性能。HashSet是基于HashMap实现的。

发表于 2019-01-18 20:54:09 回复(1)

HashMap的很多函数要基于equal()函数和hashCode()函数。hashCode()用来定位要存放的位置,equal()用来判断是否相等。 
那么,相等的概念是什么? 
Object版本的equal只是简单地判断是不是同一个实例。但是有的时候,我们想要的的是逻辑上的相等。比如有一个学生类student,有一个属性studentID,只要studentID相等,不是同一个实例我们也认为是同一学生。当我们认为判定equals的相等应该是逻辑上的相等而不是只是判断是不是内存中的同一个东西的时候,就需要重写equal()。而涉及到HashMap的时候,重写了equals(),就需要重写hashCode()

我们总结一下几条基本原则 
1. 同一个对象(没有发生过修改)无论何时调用hashCode()得到的返回值必须一样。 
如果一个key对象在put的时候调用hashCode()决定了存放的位置,而在get的时候调用hashCode()得到了不一样的返回值,这个值映射到了一个和原来不一样的地方,那么肯定就找不到原来那个键值对了。  
2. hashCode()的返回值相等的对象不一定相等,通过hashCode()和equals()必须能唯一确定一个对象 
不相等的对象的hashCode()的结果可以相等。hashCode()在注意关注碰撞问题的时候,也要关注生成速度问题,完美hash不现实
3. 一旦重写了equals()函数(重写equals的时候还要注意要满足自反性、对称性、传递性、一致性),就必须重写hashCode()函数。而且hashCode()的生成哈希值的依据应该是equals()中用来比较是否相等的字段 
如果两个由equals()规定相等的对象生成的hashCode不等,对于hashMap来说,他们很可能分别映射到不同位置,没有调用equals()比较是否相等的机会,两个实际上相等的对象可能被插入不同位置,出现错误。其他一些基于哈希方法的集合类可能也会有这个问题

发表于 2017-03-27 10:50:21 回复(3)

通过hashCodeequals方法保证元素的唯一性,当重写equals方法时,必须重写hashCode方法,因为如果不重写这两个方法,就会默认使用Object的方法,一般是不相同的,所以就会导致存储了重复值,与hashsethashmap等性质冲突。

       哈希表判断通过hashCodeequals方法判断元素是否相同的步骤如下所示:

       先看hashCode的值是否相同,因为这个是逻辑内存地址,如果

              不相同:则表示对象不相同

              如果相同:继续在桶结构中执行equals方法,equals方法返回

                     True:表示对象相同,

                     Fasle:表示对象不相同

    只有hashCodeequals方法都返回true,才表示对象相同

发表于 2017-09-10 16:06:47 回复(0)

hashCode和equals的详解:

hashCode的值是通过哈希函数计算得出的,它和地址值是映射关系,并不就是地址值,而当比较两个不同的对象时(比如在hashMap和hashSet)重写equals必须重写hashCode是为了提高比较的效率,当hashCode值不同时,二者的equals返回结果必为false,而当hashCode值相同时,则有哈希冲突,此时在哈希表中存储方式是通过探测方法逐一去查找空位,二者比较时则再调用equals方法

发表于 2017-02-28 10:53:04 回复(0)
1)hashcode和equals组合在一起确定元素的唯一性。
2)查找元素时,如果单单使用equals来确定一个元素,需要对集合内的元素逐个调用equals方法,效率太低。因此加入了hashcode方法,将元素映射到随机的内存地址上,通过hashcode快速定位到元素(大致)所在的内存地址,再通过使用equals方法确定元素的精确位置。
比较两个元素时,先比较hashcode,如果hashcode不同,则元素一定不相等;如果相同,再用equals判断。
3)HashMap采用这两个方法实现散列存储,提高键的索引性能。HashSet是基于HashMap实现的。
发表于 2019-06-21 11:45:21 回复(0)
mcq头像 mcq
往往在重写equals()方法的同时,也会重写hashCode()方法保持协调,从而在集合set和map插曲元素得时候保证准确
发表于 2016-04-23 18:38:30 回复(0)
java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。
发表于 2016-03-14 21:42:15 回复(0)
Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。
发表于 2015-10-29 12:10:41 回复(4)

hashcode这个方法是用来鉴定2个对象是否相等的。

那你会说,不是还有equals这个方法吗?

不错,这2个方法都是用来判断2个对象是否相等的。但是他们是有区别的。

一般来讲,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。举个例子,有个学生类,属性只有姓名和性别,那么我们可以认为只要姓名和性别相等,那么就说这2个对象是相等的。

hashcode方法一般用户不会去调用,比如在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode这个方法,而且也用到了equals方法。这里不可以重复是说equals和hashcode只要有一个不等就可以了!所以简单来讲,hashcode相当于是一个对象的编码,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比较起来不直观。我们一般在覆盖equals的同时也要覆盖hashcode,让他们的逻辑一致。举个例子,还是刚刚的例子,如果姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。

要从物理上判断2个对象是否相等,用==就可以了。

发表于 2018-04-17 13:27:00 回复(1)
重写hashCode() 是为了让HashMap的key有更好的分布性,使HashMap有更好的性能。
equals()是为了在hashCode值相等时判断对象是否相等,因为hashCode相等对象不一定相等
发表于 2022-10-21 22:02:34 回复(0)
java中的HashMap用着两个方法检索键值,如果没有这两个方法,如果没有这两个方法,有时两个键值会出现一个hash,会被集合认为是相等的。对HashMap的精确值和正确值很重要。
编辑于 2020-08-31 15:23:18 回复(0)
1)hashcode和equals组合在一起确定元素的唯一性。 2)查找元素时,如果单单使用equals来确定一个元素,需要对集合内的元素逐个调用equals方法,效率太低。因此加入了hashcode方法,将元素映射到随机的内存地址上,通过hashcode快速定位到元素(大致)所在的内存地址,再通过使用equals方法确定元素的精确位置。 比较两个元素时,先比较hashcode,如果hashcode不同,则元素一定不相等;如果相同,再用equals判断。 3)HashMap采用这两个方法实现散列存储,提高键的索引性能。HashSet是基于HashMap实现的
发表于 2020-08-15 11:34:25 回复(0)
<p>通过hashcode和equals方法确定键值对索引,根据键获取值时也会用到这个方法,两个不同的键可能有相同的hashcode,因此可能被认为是相等的,这两个方法对于去从,确定hashmap的精确性有很大作用</p>
发表于 2020-07-07 15:55:37 回复(0)
HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,可能会被集合认为是相等的。HashSet去重其实也是通过hashCode()和equals()方法来判断两个元素是否是同一个以此来达到去重的目的.
发表于 2020-06-27 09:39:04 回复(0)

比较对象是否相等

发表于 2020-04-01 12:39:35 回复(0)

用来确定键值对的索引

hashcode确定存放的位置

equals确定是否相等

编辑于 2020-03-04 11:08:39 回复(0)

hashcode方法是计算对象的哈希值,equals方法是判断两对象是否相同。两者互相配合可以更快判断对象是否

相同。

编辑于 2020-02-27 21:39:18 回复(0)

hashcode()用来决定元素存放的位置,但是hashcode()返回的值相等的对象不一定相等,此时需要使用equal()确定是否相等

编辑于 2019-09-16 21:19:25 回复(0)

https://blog.csdn.net/xl_1803/article/details/80445481

发表于 2019-09-02 09:03:55 回复(0)