黑马程序员技术交流社区

标题: 请教一个hashset相关的的问题 [打印本页]

作者: 李然    时间: 2013-12-14 23:16
标题: 请教一个hashset相关的的问题
想请教一下各位大神,有的书上说我们在hashset中存自定义的对象时,为了保证hashset中的元素的不一致性,要在自定义类中对object类中的hashcode()和equals()方法进行重写。我想问的是如果我们根据自定义对象中的具体数据重写完后,已经保证了每一个对象对应的内存地址都不一样,那么还有必要重写equals()吗?
是不是重写hashcode()方法就足够了?
请各位大神指点一下!!!
作者: FFF    时间: 2013-12-15 01:09
hashcode一样,但equals可能不一样,那么对象也不一样。(hashCode一样equals不一样的可能性极小,但不是没有。)当你只判断hashCode的时候,小数据是没有问题。但如果是大数据,偶然的东西,就会变成必然。然后,找BUG的时候你会死得很有节奏~~所以,equals还是写上的比较好。
我们写程序,要尽最大可能考虑到所有的情况。

Ps:
equals一样,hsahCode必然是一样的!

纯手打~~~

作者: 丑男先生。    时间: 2013-12-15 08:31

HashSet集合的特点是元素无序和不重复 。

首先,HashSet的底层数据结构是哈希表。哈希表就是存储一系列哈希值的表,而哈希值是由对象的hashCode()方法生成的。

确保元素唯一性的两个方法,hashCode()和equals()方法。

当调用add()方法向集合中存入对象的时候,先比较此对象与原有对象的哈希值有没有一样的,如果都不一样就直接存入;如果有与之相同的哈希值,则要继续比较这两个对象是否为同一个对象,此时就要调用对象的equals()方法了。

总之,只有HashCode的至相同时,才会调用equals()方法。

在判断元素是否存在和删除一个元素的时候,也是这个过程。

作者: Lillian    时间: 2013-12-15 09:30
我觉得你的意思应该是觉得既然hash一样既地址值一样了,那么他们就是指向的同一个空间喽,内容肯定是一样的。 我刚开始也有这样的困惑。
但是hashset是在判断hash值一样之后再去判断一次存储的内容是否一致。那么只有一种解释就是,hash值并不代表绝对内存地址,而是根据地址生成的一个值,所以这个值一样里面的内容并不一定一样。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2