LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   Does HashMap.get(Object) use the method equals? (https://www.linuxquestions.org/questions/programming-9/does-hashmap-get-object-use-the-method-equals-261334/)

eantoranz 12-01-2004 10:11 AM

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.

jlliagre 12-01-2004 02:19 PM

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

eantoranz 12-01-2004 02:22 PM

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())

csfalcon 12-01-2004 03:50 PM

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.

eantoranz 12-01-2004 06:01 PM

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.

jlliagre 12-01-2004 07:28 PM

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.

eantoranz 12-01-2004 10:47 PM

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?

jlliagre 12-02-2004 03:54 PM

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 ...

eantoranz 12-03-2004 04:45 AM

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.

jlliagre 12-03-2004 03:57 PM

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

eantoranz 12-03-2004 07:05 PM

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".


All times are GMT -5. The time now is 07:51 PM.