在Java中使用HashTable的问题

时间:2012-03-11 01:24:16

标签: java map hashmap hashtable

我正在尝试使用哈希表,当我试图搜索一个对象时,我没有看到该对象,但是如果我打印它我就能看到它。

节点类:

public class Node {

    int x;
    int y;


    public Node() {

        this.x=0;
        this.y=0;

    }

    public Node(int x,int y) {
        this.x=x;
        this.y=y;
    }



    public String toString(){

        return "(Node: x,y="+Integer.toString(x)+","+Integer.toString(y)+")";

    }

}

主类:

public class GridWalk {


    static Hashtable <Node, Integer> myMap;
    static Stack<Node> nodes;

    public static void main(String[] args) {

        myMap = new Hashtable<Node,Integer>();
        nodes=new Stack<Node>();

        Node start=new Node(0,0);

        Node new1= new Node(100,100);
        myMap.put(new1,new Integer(1));
        Node new2=new Node (100,100);
        System.out.println("Already there ? huh: "+new2.toString()+" at "+myMap.get(new2)); 

    }
}

我在打印行时得到NULL。知道为什么吗?

1 个答案:

答案 0 :(得分:4)

您需要在Node类中覆盖并实现equals方法。 java.lang.Object的默认实现仅比较引用的相等性,这在您的情况下是不合适的。

Node new1 = new Node(100, 100);
Node new2 = new Node(100, 100);

System.out.println(new1.equals(new2)); // Your current code will print false

HashMap依赖于equalshashCode方法的正确实现,以便正确运行。您应该实现反映对象逻辑的equals方法。类似的东西:

public boolean equals(Object o) {
    if(this == o) return true;

    final Node other = (Node) o;
    return ((getX() == o.getX()) && (getY() == o.getY());
}

您可能还想在hashCode()对象上实施Node方法。