TreeMap works but HashMap will not - is there a problem with my hashCode?
In the example below, I store objects in an array, a TreeMap and a HashMap in parallel. The array and TreeMap work as expected, but the HashMap behaves as if it there was no overloaded hashCode function. In this simple example, it should be an easy function to write, but for some reason it won't work ...
import java.util.*;
class MapTest{
privateclass WrappedIntegerimplements Comparable{
WrappedInteger (int _id){
id = _id;
}
publicint hashCode (){
return id;
}
publicboolean equals (WrappedInteger obj){
return obj.id == id;
}
public String toString (){
return String.format ("id %d", id);
}
publicint compareTo (Object o){
returnnew Integer (id).compareTo (((WrappedInteger) o).id);
}
privateint id;
}
privateclass BooleanArray{
BooleanArray (int maxLinear){
rg =newboolean [maxLinear];
treeMapTracker =new TreeMap<WrappedInteger, Boolean> ();
hashMapTracker =new HashMap<WrappedInteger, Boolean> ();
}
void put (WrappedInteger s,boolean f){
rg [s.hashCode ()] = f;
Boolean bTree = treeMapTracker.get (s);
Boolean bHash = hashMapTracker.get (s);
if (bHash ==null && bTree !=null){
System.out.println ("MAP TRACKER ERROR: already in TreeMap but not in HashMap: " + s.toString ());
}
if (bHash !=null && bTree ==null){
System.out.println ("MAP TRACKER ERROR: already in HashMap but not in TreeMap: " + s.toString ());
}
if (bTree ==null){
nPut++;
}
treeMapTracker.put (s, f);
hashMapTracker.put (s, f);
}
int size (){
if (nPut != treeMapTracker.size ()){
System.out.println ("MAP TRACKER ERROR: nPut=" + nPut +", treeMapTracker.size ()=" + treeMapTracker.size ());
}
if (nPut != hashMapTracker.size ()){
System.out.println ("MAP TRACKER ERROR: nPut=" + nPut +", hashMapTracker.size ()=" + hashMapTracker.size ());
}
return nPut;
}
Boolean get (WrappedInteger s){
Boolean bTree = treeMapTracker.get (s);
if (bTree ==null){
System.out.println ("MAP TRACKER ERROR: treeMapTracker.get (s)=null");
}elseif (rg [s.hashCode ()] != bTree){
System.out.println ("MAP TRACKER ERROR: rg [s.hashCode ()]=" + rg [s.hashCode ()] +", treeMapTracker.get (s)=" + bTree);
}
Boolean bHash = hashMapTracker.get (s);
if (bHash ==null){
System.out.println ("MAP TRACKER ERROR: hashMapTracker.get (s)=null");
}elseif (rg [s.hashCode ()] != bHash){
System.out.println ("MAP TRACKER ERROR: rg [s.hashCode ()]=" + rg [s.hashCode ()] +", hashMapTracker.get (s)=" + bHash);
}
returnnew Boolean (rg [s.hashCode ()]);
}
privateboolean rg [];
private Map<WrappedInteger, Boolean> treeMapTracker;
private Map<WrappedInteger, Boolean> hashMapTracker;
privateint nPut= 0;
}
publicvoid test (){
BooleanArray booleanArray =new BooleanArray (10);
booleanArray.put (new WrappedInteger (3),true);
booleanArray.put (new WrappedInteger (8),false);
booleanArray.put (new WrappedInteger (3),true);
booleanArray.put (new WrappedInteger (8),true);
booleanArray.put (new WrappedInteger (9),false);
System.out.println ("boolean array now has size: " + booleanArray.size ());
System.out.println ("[3] = " + booleanArray.get (new WrappedInteger (3)));
System.out.println ("[8] = " + booleanArray.get (new WrappedInteger (8)));
System.out.println ("[9] = " + booleanArray.get (new WrappedInteger (9)));
System.out.println ("[5] = " + booleanArray.get (new WrappedInteger (5)));
}
// This procedure exists for unit testing only and is never normally invoked.
publicstaticvoid main (String [] args){
MapTest governor =new MapTest ();
governor.test ();
}
}
Results:
MAP TRACKER ERROR: already in TreeMap but not in HashMap: id 3
MAP TRACKER ERROR: already in TreeMap but not in HashMap: id 8
MAP TRACKER ERROR: nPut=3, hashMapTracker.size ()=5
boolean array now has size: 3
MAP TRACKER ERROR: hashMapTracker.get (s)=null
[3] =true
MAP TRACKER ERROR: hashMapTracker.get (s)=null
[8] =true
MAP TRACKER ERROR: hashMapTracker.get (s)=null
[9] =false
MAP TRACKER ERROR: treeMapTracker.get (s)=null
MAP TRACKER ERROR: hashMapTracker.get (s)=null
[5] =false

