问答详情
源自:6-2 学生选课---判断 Set 中课程是否存在

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

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

提问者:jerseyyu 2015-08-27 00:30

个回答

  • 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 的方法,一般情况下我们重写都会把两个都重写的。