为何Set中的contains 方法运用的是hashCode+equals的模式 而List里面是equals的 模式?

来源:6-2 学生选课---判断 Set 中课程是否存在

jerseyyu

2015-08-27 00:30

hashCode表示的是对象的地址吧,那直接equals不就行了?

写回答 关注

4回答

  • wshyzx
    2016-07-26 18:51:02

    详细的可以去看HashMap的contains实现,那里是equals和hashCode两个同时使用了,所以在有Map的时候,必须两个都要验证。HashSet也验证两个。但是在ArrayList里不验证hashCode,所以你不重写hashCode也无所谓。

    equals和hashcode方法要同时重写,并且要在equals为true的时候,hashCode必须要相同。这个已经是一种不成文的规定了,这两个方法要重写就要一起重写,而且IDE里也会将只重写一个视为警告。所以这两个方法要同时重写。



  • 如果繁星能来到我身边
    2016-05-11 21:30:26

    equals 方法在非空对象引用上实现相等关系:

    自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。

    对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。

    传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。

    一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。

    对于任何非空引用值 x,x.equals(null) 都应返回 false。

    Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

    注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。


    参数:

    obj - 要与之比较的引用对象。

    返回:

    如果此对象与 obj 参数相同,则返回 true;否则返回 false。


  • qq电子时代
    2016-04-11 09:47:42

    Set的子类是HashSet,具体什么原因不知道,不过通过子类初始化,就存在hash了不是吗

  • _神人A
    2015-11-04 23:59:39

    因为List 那里没有用到 hash 的方法,一般情况下我们重写都会把两个都重写的。

    qq电子时代

    List中对equals进行重写,重写以前是怎么执行的,重写后又怎么执行的 能不能举举例子

    2016-04-11 09:46:14

    共 1 条回复 >

Java入门第三季

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

409792 学习 · 4340 问题

查看课程

相似问题