You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by Mike Moran <mi...@mac.com> on 2003/04/03 14:05:17 UTC
HashMap does use equals() [was Re: DO NOT REPLY [Bug 18355] -
HttpState cannot differentiate credentials for different hosts with same
Realm names]
bugzilla@apache.org wrote:
[ ... ]
>The reason is because HashMap only compares the hashCodes of
>the objects and never consults equals.
>
[ ... ]
This is not the case. HashMap uses equals() when the hashCode() of two
objects are the same. If you want good performance it is a good idea to
have the hashCode() different or at least evenly distributed. However,
it is not necessary. As a test, try the following code:
import java.util.*;
public class HashMapThing
{
private static class Key
{
private int hashCode;
private String content;
private String tag;
public Key(int hashCode, String content, String tag)
{
this.hashCode = hashCode;
this.content = content;
this.tag = tag;
}
public int hashCode()
{
System.out.println("hashCode() called on " + toString());
return hashCode;
}
public boolean equals(Object o)
{
System.out.println("equals() called on " + toString()
+ ", " + o.toString());
if (o instanceof Key) {
Key other = (Key) o;
return this.content.equals(other.content);
}
else {
return false;
}
}
public String toString()
{
return "tag: \"" + tag
+ "\" code: " + hashCode
+ " content: \"" + content + "\"";
}
}
public static void main(String[] args) throws Exception
{
Key entryA = new Key(0, "0", "A");
Key entryB = new Key(0, "0", "B");
Key entryC = new Key(0, "1", "C");
System.out.println("Adding entries:");
Map map = new HashMap();
System.out.println("A");
map.put(entryA, "1");
System.out.println("B");
map.put(entryB, "2");
System.out.println("C");
map.put(entryC, "3");
System.out.println("\nGetting entries:");
String out1 = (String) map.get(entryA);
String out2 = (String) map.get(entryC);
System.out.println("\nEntries:");
System.out.println("1: " + out1);
System.out.println("2: " + out2);
}
}
--
Mike