LinuxQuestions.org
Download your favorite Linux distribution at LQ ISO.
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices

Reply
 
Search this Thread
Old 12-01-2004, 10:11 AM   #1
eantoranz
Senior Member
 
Registered: Apr 2003
Location: Colombia
Distribution: Kubuntu, Debian, Knoppix
Posts: 1,982
Blog Entries: 1

Rep: Reputation: 83
Question Does HashMap.get(Object) use the method equals?


I'm passing some data around using a HashMap.

I am using instances of one of my classes as key. I overrid the equals(Object) method so that diferent instances of the same class (key class) with the same ID are equal.

When I use the get(Object) method on the HashMap I expect to see messages on the console I wrote in the equals of the key objects... but it doesn't work.

What's wrong?

The only thing I can come up is that the HashMap be not using the equals method to compare the keys.
 
Old 12-01-2004, 02:19 PM   #2
jlliagre
Moderator
 
Registered: Feb 2004
Location: Outside Paris
Distribution: Solaris10, Solaris 11, Mint, OL
Posts: 9,505

Rep: Reputation: 360Reputation: 360Reputation: 360Reputation: 360
Why not finding by yourself ?
Java classes source code is included in the JDKs, usually as a zip file (src.zip) in the top directory.
Look for java/util/HashMap.java
 
Old 12-01-2004, 02:22 PM   #3
eantoranz
Senior Member
 
Registered: Apr 2003
Location: Colombia
Distribution: Kubuntu, Debian, Knoppix
Posts: 1,982
Blog Entries: 1

Original Poster
Rep: Reputation: 83
I didn't want to go that way, but follow the API... and according to what I've read that's what should happen (equals())
 
Old 12-01-2004, 03:50 PM   #4
csfalcon
Member
 
Registered: Jun 2004
Location: MD
Distribution: Fedora Core
Posts: 269

Rep: Reputation: 31
Does your program function as you like it to? Does it find the right object for that key?

If your equals() function is different than the default, try to create a case where the default behavior would fail.
 
Old 12-01-2004, 06:01 PM   #5
eantoranz
Senior Member
 
Registered: Apr 2003
Location: Colombia
Distribution: Kubuntu, Debian, Knoppix
Posts: 1,982
Blog Entries: 1

Original Poster
Rep: Reputation: 83
My program doesn't work the way I want.

I'll try to explain myself. Suppose this:
Code:
Map myMap = new HashMap();
Integer key = new Integer(5);
String value = "five";
myMap.put(key, value);
key = new Integer(12); value = "twelve"; myMap.put(key, value);
key = new Integer(20); value = "twenty"; myMap.put(key, value);

key = new Integer(5);
// this is the trick
value = (String) myMap.get(key);

System.out.println(value); // this should print "five"
Though the key that I used is not the same instance of Integer that I used to put the value, I should get the same value that I used when I inserted "five" as a value, and that is because New Integer(5).equals(new Integer(5)) is true (as far as I know). Am I wrong?

If I'm correct then I don't know why the F&/(%&NG HashMap doesn't get me the right values because I overid the equals(Object) method of the classes that I'm using as keys.

Last edited by eantoranz; 12-01-2004 at 06:06 PM.
 
Old 12-01-2004, 07:28 PM   #6
jlliagre
Moderator
 
Registered: Feb 2004
Location: Outside Paris
Distribution: Solaris10, Solaris 11, Mint, OL
Posts: 9,505

Rep: Reputation: 360Reputation: 360Reputation: 360Reputation: 360
You piece of code gives five for me.
If you have a different behaviour, you are probably right thinking overriding the equals method is the source of your problem.
By the way, reading the Java source code is not forbidden and may be instructive.
 
Old 12-01-2004, 10:47 PM   #7
eantoranz
Senior Member
 
Registered: Apr 2003
Location: Colombia
Distribution: Kubuntu, Debian, Knoppix
Posts: 1,982
Blog Entries: 1

Original Poster
Rep: Reputation: 83
I know it's not forbidden, man.... but I only need the APIs behavior of things... i don't want to throw myself to take a look at the source code.

OK... So you agree with me that it's "five"... then why the hell don't my classes work?

Could it be that instead of overriding equals(Object ) I should OVERLOAD it with equals(MyClass)?

It's just a wild guess. What do you think?
 
Old 12-02-2004, 03:54 PM   #8
jlliagre
Moderator
 
Registered: Feb 2004
Location: Outside Paris
Distribution: Solaris10, Solaris 11, Mint, OL
Posts: 9,505

Rep: Reputation: 360Reputation: 360Reputation: 360Reputation: 360
Quote:
What do you think?
I still think you peeping the code won't kill you ...

Reading other's people code is instructive and helps you improving your style.

Just reading the APIs is not enough, it's just like if you want to be a book writer, but forbid yourself to read anything but a dictionary ...
 
Old 12-03-2004, 04:45 AM   #9
eantoranz
Senior Member
 
Registered: Apr 2003
Location: Colombia
Distribution: Kubuntu, Debian, Knoppix
Posts: 1,982
Blog Entries: 1

Original Poster
Rep: Reputation: 83
You just won't take no for an answer, will you?

I (as a developer) can't take the time to study everything everyone has written. If there's one specification that stipulates the way one method in a class works, I SHOULDN'T need to go to ONE IMPLEMENTATION to take a look at the code, I have to trust the specification cause that's what the code should implement anyway (any implementation).

Any way:
I took a closer look at the API specification and found that (apparently) the AbstractMap will go through the keys and compare them, probably doing a "=="..... it doesn't say it will use the equals(Object) method. So I guess that's the problem.
 
Old 12-03-2004, 03:57 PM   #10
jlliagre
Moderator
 
Registered: Feb 2004
Location: Outside Paris
Distribution: Solaris10, Solaris 11, Mint, OL
Posts: 9,505

Rep: Reputation: 360Reputation: 360Reputation: 360Reputation: 360
Quote:
I (as a developer) can't take the time to study everything everyone has written.
I won't do it either just for you ...

If you feel the specs aren't clear enough or do not represent the reality of the implementation, just confirm it by looking the code and then file a bug at http://bugs.sun.com/bugdatabase/index.jsp
 
Old 12-03-2004, 07:05 PM   #11
eantoranz
Senior Member
 
Registered: Apr 2003
Location: Colombia
Distribution: Kubuntu, Debian, Knoppix
Posts: 1,982
Blog Entries: 1

Original Poster
Rep: Reputation: 83
That sounds OK.

However, I just wanted someone to tell me something like: "man, you're completely lost in space... instead of a HashMap you have to use XMap".
 
  


Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How can I tell one object to do a method in javascript? eantoranz Programming 1 10-29-2004 01:20 PM
hashtable/hashmap+linux+C saajii Programming 2 09-20-2004 07:32 PM
Event driven object-to-object: C++ template class mecanism ( NOT STL or STDC++) bretzeltux Programming 2 12-23-2003 02:45 PM
Perl undefined subroutine /can't locate object method cobien Programming 1 11-17-2003 10:47 AM
Can't locate object method "splitpath" via package "File::Spec" RobJohnston Linux - General 2 06-28-2003 09:59 AM


All times are GMT -5. The time now is 11:06 PM.

Main Menu
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
identi.ca: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration