Is Set.contains () installed on OpenJDK 6?

I ran into a really weird problem. I wrote a simple Deck class, which is a standard 52-card deck of playing cards. The class has a missingCards() method, which returns a set of all cards that were taken from the deck. If I try to compare two identical sets of missing maps using .equals() , they tell me that they are different, and if I check if there is a set containing the element that I know is used with .contains() , I return 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 the sake of clarity, I added two loops after I noticed that the test failed. The first cycle pulled out a card from drawCards, and then this card is checked for each card in missingCards - it always matches one, so the card should contained in missingCards. However, missingCards.contains () does not work)

And here is an example of its 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 .equals implementation on my map class is correct and, as you can see from the output, it works!

What's going on here?

Greetings

Pete

+4
source share
4 answers

You forgot to implement hashCode () according to equals () : (Ie, equal objects must return the same hash code).

+11
source

Is Set.contains () installed on OpenJDK 6?

No, it is not.

The first rule of Java debugging is that 99.9% of the time is your code that is broken, not standard Java libraries.

+8
source

What about hashCode? According to Joshua Bloch, "Effective Java" chapter 3 , you should always redefine these two conventions.

Submit your class card. Then it will be easy to determine.

+3
source

Please put the code for the Deck class - at least the equals(Object) and hashCode() methods.

First of all, I assume that you only executed equals() , but not hashCode() . In this case, read the documentation for the java.lang.Object class.

+2
source

Source: https://habr.com/ru/post/1311684/


All Articles