wood burning stoves 2.0*
The moose likes Java in General and the fly likes Using java.util.HashSet for Custom Class Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of OCA/OCP Java SE 7 Programmer I & II Study Guide this week in the OCPJP forum!
JavaRanch » Java Forums » Java » Java in General
Bookmark "Using java.util.HashSet for Custom Class" Watch "Using java.util.HashSet for Custom Class" New topic
Author

Using java.util.HashSet for Custom Class

Rajasekar Elango
Ranch Hand

Joined: Sep 13, 2004
Posts: 105
Hi,

I am trying to use java.util.HashSet for storing collection of non-duplicate values of my own custom class.

Here is the sample program which I tried.




Output:

hashcode called97
hashcode called98
hashcode called97
hashcode called98
hashcode called97
s = [a, a, a, 1, b, b]

The UsingSet class has a single field value and two UsingSet instances are equal if their values are equal.

I dont know how add() method works to compare objects. But from the above output the add() method is not using the overloaded equals method (the print statements are getting not printed) and it adds to set even if attribute value has the same value.

Overloading hashCode() method also doesn't seems to work.

I tried the same with java.util.TreeSet() by passing my own comparator to constructor and it works fine.

Is it not possible with HashSet()..?

But again, trying the same for Integer class (look at last two add statements and output) works fine and Integer instances considered as equal if their values are equal..

So I think this should be possible..

Can you please help me if anyone know how to implement this.

Thanks very much,

Raja.
Petr Blahos
Ranch Hand

Joined: Apr 28, 2004
Posts: 131
Hi Rajasekar,

Your signature of equals is wrong. It should be:


In your code you do not override but overload, therefore
the old good Object.equals is called.

P.
[ October 06, 2004: Message edited by: Petr Blahos ]

Get a better web browser:<br /><a href="http://www.mozilla.org/products/firefox/switch.html" target="_blank" rel="nofollow">http://www.mozilla.org/products/firefox/switch.html</a>
Rajasekar Elango
Ranch Hand

Joined: Sep 13, 2004
Posts: 105
Thanks Petr Blahos

Yes It works now.
Tushar Mishra
Greenhorn

Joined: Jan 27, 2006
Posts: 7
Hi,

I am facing a similar problem. The equals method seems to have been defined correctly
I am trying to use a custom class for HashSet. I have overridden the equals and hashcode method.

Observations
1. if I use Hashset, both the employees get added. However, e1.equals(e2) returns true.
2. If I use TreeSet, Only 1 object gets added.

While debugging, Employee -> equals method doesn't seem to get called from HashSet -> add method

What mistake am I making here ?









Thanks,
Tushar
Rob Spoor
Sheriff

Joined: Oct 27, 2005
Posts: 19725
    
  20

Please don't kick a 4 year old thread.


SCJP 1.4 - SCJP 6 - SCWCD 5 - OCEEJBD 6
How To Ask Questions How To Answer Questions
Ernest Friedman-Hill
author and iconoclast
Marshal

Joined: Jul 08, 2003
Posts: 24187
    
  34

Your hashCode() method is based on the name, but equals is based on the id. The behavior of the two methods is therefore inconsistent. In particular, the two objects you're testing with are equals(), but they have different hashCode() values. The HashSet will only call equals() to check for the equality of two objects with the same hashCode().


[Jess in Action][AskingGoodQuestions]
Campbell Ritchie
Sheriff

Joined: Oct 13, 2005
Posts: 39478
    
  28
Also your equals() method does not test whether the two Objects are of the same class; you can suffer a ClassCastException.

Google for Angelika Langer Java equals method and you will find some useful information there.
Ernest Friedman-Hill
author and iconoclast
Marshal

Joined: Jul 08, 2003
Posts: 24187
    
  34

Campbell Ritchie wrote:Also your equals() method does not test whether the two Objects are of the same class; you can suffer a ClassCastException.


equals() does indeed, although compareTo() does not.
Tushar Mishra
Greenhorn

Joined: Jan 27, 2006
Posts: 7
Hi Ernest / Campbell,

Thanks for your quick reply.

I changed the hashcode() method and made it consistent with equals() method as below. I am getting the expected results now. Thanks for clarifying the concept regarding equals() and hashcode() methods.



I am sorry for the late reply.
 
Don't get me started about those stupid light bulbs.
 
subject: Using java.util.HashSet for Custom Class