【问题标题】:HashSet.contains is returning false while it should notHashSet.contains 不应该返回 false
【发布时间】:2018-05-23 03:46:09
【问题描述】:

我正在尝试学习 Java,并且我达到了 HashSet 部分,长话短说我正在测试 contains 方法。

public static void main(String[] args) {
    HashSet<Integer> firstSet = new HashSet<>();
    firstSet.add(3);

    HashSet<Integer> secondSet = new HashSet<>();
    secondSet.add(3);

    boolean var = firstSet.contains(secondSet);

    System.out.println(var);

}

我相信这段代码应该返回 true,而它返回 false。任何帮助!

【问题讨论】:

  • There is a difference between contains and containsAll。第一个集合绝对不包含第二个集合本身,而它确实包含第二个集合的所有元素
  • 您正在检查您的第一个 HashSet 是否不包含第二个 HashSet 的值,而是包含 HashSet 本身,如果不是 firstSet.add(3);你做了 firstSet.add(secondSet),你的第一个集合的通用参数是 >,而不是你的结果是真的。
  • 是的,是的,我应该使用 containsAll 而不是 contains,谢谢..
  • 如果您想检查超集,请使用containsAll,正如人们所指出的那样,但还要注意,对于您的两个 HashSet,firstSet.equals(secondSet) 将是 true

标签: java hashset


【解决方案1】:
boolean var = firstSet.contains(secondSet);

这条线导致了问题,因为你没有检查来自secondSet的特定元素的存在,你检查你的firstSet是否存储整个 secondSet本身,这显然是假的。

您应该检查一下,例如,是. contains(secondSet.get(0)) 还是.contains(3)

如果您的意图是检查firstSet 是否包含secondSet 中存在的所有元素,您可以使用firstSet.containsAll(secondSet)

【讨论】:

    【解决方案2】:

    让我们看看docs 对应contains

    如果此集合包含指定元素,则返回 true。更正式地说,当且仅当这个集合包含一个元素 e 使得 (o==null ? e==null : o.equals(e)) 时才返回 true。

    既然我们都知道这里没有空值,我们可以说如果o.equals(e)contains 将返回true。

    o 是您传递给contains 的参数,即HashSete 是第一组的元素,应该是Integer。由于IntegerHashSet 是不相关的类型,它们相等的可能性很小。

    您似乎在这里犯了一个逻辑错误。要检查一个集合是否是另一个集合的超集,请改为调用containsAll

    如果此集合包含指定集合中的所有元素,则返回 true。

    【讨论】:

    • 然后你可能会问为什么contains 使用Object 而不是E,这将使这种错误不可能发生:这是由于历史原因和向后兼容性,因为HashSet在泛型被添加到 Java 之前就已经存在。他们无法将contains 方法更改为采用E 而不是Object,因为这会破坏向后兼容性。
    猜你喜欢
    • 2017-09-19
    • 2012-05-14
    • 2013-02-15
    • 1970-01-01
    • 2016-01-02
    • 2019-03-29
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多