By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
438,541 Members | 1,109 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 438,541 IT Pros & Developers. It's quick & easy.

.equals(o) and Set membership

P: n/a
i have a class, in which i have override the Object.equals(Object o)
method... and then i try to make two equal objects (under the new
definition) and place them into a HashSet... which should only accept one
of them, as in the following code. the class holds two objects (a pair of
objects) and if another member of the class contains the same two objects
(in either place of the ordered pair), it is considered equal.

Integer key1 = new Integer(1);
Integer key2 = new Integer(2);
HashSet x = new HashSet();
// demonstrate that the equals() method works...
System.out.println((new MyClass(key1, key2)).equals(new myClass(key2,
key1)));
System.out.println(x.add(new MyClass(key1, key2)));
System.out.println(x.add(new MyClass(key2, key1)));
if i'm correct in reading the docs about how Set classes work, the output
of this should be:

true
true
false

but instead i'm getting:

true
true
true

and indeed the Set x has two elements after this code.

i thought the Set code checks for membership by applying the .equals()
method, which at runtime should bind to my overridden method, no?

thanks for any help,

murat
--
Murat Tasan
mx**@po.cwru.edu
ta***@eecs.cwru.edu
mu*********@cwru.edu
http://genomics.cwru.edu

Jul 17 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
Murat Tasan wrote:

i thought the Set code checks for membership by applying the .equals()
method, which at runtime should bind to my overridden method, no?


No, that is not correct. Whenever equals() is overloaded, hashCode()
must be overloaded as well. The Collections classes depend on
hashCode() and equals(). Read the javadoc for java.lang.Object
carefully and implement hashCode() for your classes for which you have
overridden equals() and you will see better results.

HTH,
Ray

Jul 17 '05 #2

P: n/a
Murat Tasan <ta***@eecs.cwru.edu> wrote in message news:<Pine.SOL.4.53.0312041520470.18529@homer>...
i have a class, in which i have override the Object.equals(Object o)
method... and then i try to make two equal objects (under the new
definition) and place them into a HashSet... which should only accept one
of them, as in the following code. the class holds two objects (a pair of
objects) and if another member of the class contains the same two objects
(in either place of the ordered pair), it is considered equal.

Integer key1 = new Integer(1);
Integer key2 = new Integer(2);
HashSet x = new HashSet();
// demonstrate that the equals() method works...
System.out.println((new MyClass(key1, key2)).equals(new myClass(key2,
key1)));
System.out.println(x.add(new MyClass(key1, key2)));
System.out.println(x.add(new MyClass(key2, key1)));
if i'm correct in reading the docs about how Set classes work, the output
of this should be:

true
true
false

but instead i'm getting:

true
true
true

and indeed the Set x has two elements after this code.

i thought the Set code checks for membership by applying the .equals()
method, which at runtime should bind to my overridden method, no?

thanks for any help,

murat


My guess is: your equals() method is not equal to the Object#equals()
method in its signature. I also made the error in my Java beginner
days, numerous times may be!
Jul 17 '05 #3

P: n/a
Murat Tasan <ta***@eecs.cwru.edu> wrote in message news:<Pine.SOL.4.53.0312041520470.18529@homer>...
i have a class, in which i have override the Object.equals(Object o)
method... and then i try to make two equal objects (under the new
definition) and place them into a HashSet... which should only accept one
of them, as in the following code. the class holds two objects (a pair of
objects) and if another member of the class contains the same two objects
(in either place of the ordered pair), it is considered equal.

Integer key1 = new Integer(1);
Integer key2 = new Integer(2);
HashSet x = new HashSet();
// demonstrate that the equals() method works...
System.out.println((new MyClass(key1, key2)).equals(new myClass(key2,
key1)));
System.out.println(x.add(new MyClass(key1, key2)));
System.out.println(x.add(new MyClass(key2, key1)));
if i'm correct in reading the docs about how Set classes work, the output
of this should be:

true
true
false

but instead i'm getting:

true
true
true

and indeed the Set x has two elements after this code.

i thought the Set code checks for membership by applying the .equals()
method, which at runtime should bind to my overridden method, no?

thanks for any help,

murat


Sorry, my previous reply is wrong. Java.util.HashXxx data structure
classes check hashCode() of the added/stored objects. See javadoc for
Object#hashCode() and source files HashSet.java and HashMap.java. The
former depends on the latter in logic reuse.
Jul 17 '05 #4

P: n/a
thanks much, i totally forgot about that!

murat

On Fri, 5 Dec 2003, Raymond DeCampo wrote:
Murat Tasan wrote:

i thought the Set code checks for membership by applying the .equals()
method, which at runtime should bind to my overridden method, no?


No, that is not correct. Whenever equals() is overloaded, hashCode()
must be overloaded as well. The Collections classes depend on
hashCode() and equals(). Read the javadoc for java.lang.Object
carefully and implement hashCode() for your classes for which you have
overridden equals() and you will see better results.

HTH,
Ray


--
Murat Tasan
mx**@po.cwru.edu
ta***@eecs.cwru.edu
mu*********@cwru.edu
http://genomics.cwru.edu

Jul 17 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.