黑马程序员技术交流社区

标题: 关于equals方法到底比较的是什么的问题 [打印本页]

作者: 阿里策    时间: 2013-10-14 19:46
标题: 关于equals方法到底比较的是什么的问题
本帖最后由 阿里策 于 2013-10-15 18:18 编辑

    看到HashSet这一块,关于equals有点疑问,我们知道HashSet底层数据结构是哈希表,所以存放的时候,先查看存放元素的哈希值,如果hash地址值一样,再用equals比较看这两个对象到底是不是同一个对象。所以我有疑问:在Object超类中,equals方法比较的不就是通过比较哈希地址值来判断是不是同一个对象吗?现在哈希值都一样了怎么还能用equals比较这两个对象是不是同一个对象呢?还是只是方法的执行顺序问题????    求指教。


作者: 黑马戴帅军    时间: 2013-10-14 20:29
可以通过看HashSet存储元素唯一性的判断方法来解决这个问题、
        如果对象的hashCode值不同,那么不用再次判断对象的equals方法是否为true。
        如果对象的hashCode值相同,那么次再次判断对象的equals方法是否为true。
        如果为true,则视为相容元素,不存。如果为false,那么视为不同元素,就进行存储。
        如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。
       通常情况下,可以通过构造比较器的方法来实现对元素按照指定的顺序排序。




这样,在回过头来看楼主的问题,好像迎刃而解了。

作者: 周志龙    时间: 2013-10-14 20:41
我来答吧,这部分在高新技术力会有专门的一集来讲这个问题,你要记住:equals比较相同的那哈希值一定相同,哈希值相同的equals不一定相同,原因是有的对象的哈希值可能会一致,想要了解的再详细你可以专门看那集
作者: 田丰    时间: 2013-10-14 20:54
equels比较的是对象的地址,但是==比较的也是,equals如果不重写的话跟==没有什么本质上的差别,一般都要重写。  重写equals需要满足的条件:
自反性:对任意x,x.equals(x)一定返回ture。
对称性:对任意x和y,如果x.equals(y)返回ture,那么y.equals(x)也返回ture。
传递性:
一致性:
对任意不是null的x,如果x.equals(null),一定返回false

作者: To    时间: 2013-10-15 17:59
楼主你好,如果问题已解决请将帖子状态修改为提问结束,如果未解决请继续提问,谢谢合作
如果不会修改请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




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