Java - 在OpenJDK 6上打破了Set.contains()吗?

4 java contains equals set

我遇到了一个非常奇怪的问题.我写了一个简单的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);
}
Run Code Online (Sandbox Code Playgroud)

(编辑:为了清楚起见,我在注意到测试失败后添加了两个循环.第一个循环从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
Run Code Online (Sandbox Code Playgroud)

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

这里发生了什么?

干杯,

皮特

Dim*_*eou 11

你忘了以与equals() :) 一致的方式实现hashCode()(即,相等的对象必须返回相同的哈希码).


Ste*_*n C 8

Java - 在OpenJDK 6上打破了Set.contains()吗?

不它不是.

调试Java的第一条规则是,99.9%的时间是您的代码被破坏,而不是Java标准库.