Java - Is Set.contains() broken on OpenJDK 6?

Posted by Peter on Stack Overflow See other posts from Stack Overflow or by Peter
Published on 2010-06-03T00:34:27Z Indexed on 2010/06/03 0:44 UTC
Read the original article Hit count: 277

Filed under:
|
|
|
|

Hey,

I've come across a really strange problem. I have written a simple Deck class which represents a standard 52 card deck of playing cards. The class has a method missingCards() which returns the set of all cards which have been drawn from the deck. If I try and compare two identical sets of missing cards using .equals() I'm told they are different, and if I check to see if a set contains an element that I know is there using .contains() I am returned false.

Here is my test code:

    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);
}

(Edit: Just for clarity I added the two loops after I noticed the test failing. The first loop pulls out a card from drawnCards and then this card is checked against every card in missingCards - it always matches one, so that card must be contained in missingCards. However, missingCards.contains() fails)

And here is an example of it's output:

[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

I am completely sure that the implementation of .equals on my card class is correct and, as you can see from the output it does work!

What is going on here?

Cheers,

Pete

© Stack Overflow or respective owner

Related posts about java

Related posts about bugs