Java - Set.contains() 在 OpenJDK 6 上损坏了吗?

标签 java set equals contains

我遇到了一个非常奇怪的问题。我编写了一个简单的 Deck 类,它表示一副标准的 52 张扑克牌。该类有一个方法 missingCards(),它返回从一副牌中抽出的所有牌的集合。如果我尝试使用 .equals() 比较两组相同的缺失卡片,我会被告知它们是不同的,如果我检查一组是否包含我知道的元素,则使用 .contains() 我返回 false

这是我的测试代码:

    public void testMissingCards() 
{
    Deck deck = new Deck(true);
    Set<Card> drawnCards = new HashSet<Card>();
    drawnCards.add(deck.draw());
    drawnCards.add(deck.draw());
    drawnCards.add(deck.draw());
    Set<Card> missingCards = deck.missingCards();
    System.out.println(drawnCards);
    System.out.println(missingCards);
    Card c1 = null;
    for (Card c : drawnCards){
        c1 = c;
    }
    System.out.println("C1 is "+c1);
    for (Card c : missingCards){
        System.out.println("C is "+c);
        System.out.println("Does c1.equal(c) "+c1.equals(c));
        System.out.println("Does c.equal(c1) "+c.equals(c1));
    }
    System.out.println("Is c1 in missingCards "+missingCards.contains(c1));
    assertEquals("Deck confirm missing cards",drawnCards,missingCards);
}

(编辑:为清楚起见,我在注意到测试失败后添加了两个循环。第一个循环从 drawnCards 中取出一张卡片,然后对照 missingCards 中的每张卡片检查这张卡片 - 它总是匹配一张,所以这张卡片必须包含在 missingCards 中。但是,missingCards.contains() 失败)

这是它的输出示例:

[5C, 2C, 2H]
[2C, 5C, 2H]
C1 is 2H
C is 2C
Does c1.equal(c) false
Does c.equal(c1) false
C is 5C
Does c1.equal(c) false
Does c.equal(c1) false
C is 2H
Does c1.equal(c) true
Does c.equal(c1) true
Is c1 in missingCards false

我完全确定 .equals 在我的卡片类上的实现是正确的,正如您从输出中看到的那样,它确实有效!

这是怎么回事?

干杯,

皮特

最佳答案

您忘记实现 hashCode()在某种程度上与 equals() 一致:) (即,相等的对象必须返回相同的哈希码)。

关于Java - Set.contains() 在 OpenJDK 6 上损坏了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2962604/

相关文章:

java - 使用 EclipseLink 的 JPA 实体的 equals() 和 hashcode()

java - equals() 方法如何在字符串缓冲区中工作?

java - 如何在 JTextPane java 中复制图像?

java - 在Java中,如何删除.com或.net之后的所有内容

SQL 剪切并粘贴到列

ios - 如何生成所有可能的组合?

c# - 不区分大小写比较字符串和非字符串

java - 应用程序在后台时的 Android 广播接收器

java - 有 ReSTLet TaskService 的示例吗?

java - 如何在多个集合中找到最受欢迎的元素