【问题标题】:Java ArrayList Interface TypeJava ArrayList 接口类型
【发布时间】:2012-03-06 14:26:30
【问题描述】:

我有许多实现通用接口的类。我使用 Array List mytypes 之类的定义,并将该类型的对象添加到 ArrayList。现在我想使用 ArrayList 类的 contains 方法来查看这个 List 是否包含我要添加的类。

如果我在类上实现hashcodeequals,contains 方法会知道某个对象是否已经在 ArrayList 中吗?

【问题讨论】:

  • 这取决于ArrayList 的实现。

标签: java arraylist


【解决方案1】:

来自List.contains()

如果此列表包含指定元素,则返回 true。更多的 正式地,当且仅当此列表包含至少一个时才返回 true 元素 e 使得 (o==null ? e==null : o.equals(e))。

所以基本上hashCode()在这里不相关,只有equals()

编辑:[显式优于隐式],正如@aiobee 在 cmets 中提到的,equals() 仍然需要被覆盖 - 根据合同 - 但它不会对价值产生影响由contains()返回

【讨论】:

  • 根据合同,hashCode 仍应如 OP 所述被覆盖。
  • @aioobe:是的,确实如此,我完全同意这一点——但这与contains() 的返回值无关。无论如何,我将它添加到答案中,因为它确实值得明确提及。
【解决方案2】:

ArrayList.contains 不会使用hashCode,但会使用equalsas documented

如果此列表包含指定元素,则返回 true。更正式地说,当且仅当此列表包含至少一个元素 e 满足 (o==null ? e==null : o.equals(e)) 时,才返回 true。

(这不会检查“这个类”是否已经在列表中 - 它会检查一个相等的对象是否在列表中。)

【讨论】:

  • 但是 ArrayList 的类型是一个接口。 JVM会在实现Interface的类上调用equals方法????
  • @user365019:是的,正如它所记录的那样。
【解决方案3】:

实现 hashCode 对此目的没有用,但同时覆盖 equals 和 hashCode 是一种谷歌实践。

是的,它会起作用,这就是 contains 方法的目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2011-04-12
    • 2021-09-01
    • 2012-12-19
    • 2013-07-05
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多