即使hashcode()相同,HashMap <node,integer =“”> get也返回null

时间:2017-03-18 23:44:11

标签: java hash nullpointerexception hashmap hashtable

我有一个自定义类Node:

public static class Node{

    int _id;
    // adjacent node and its cost
    HashMap<Node, Integer> _adjList = new HashMap<>();

    public Node(int id){
        _id = id;
    }

    public boolean equals(Node n) {
        if (n == null)
            return false;
        return _id == n._id;
    }

    public int hashCode(){
            return _id;
    }

    public String toString(){
        return "("+_id+")";
    }

}//Node

我将它用作HashMap<Node, Integer> costs的密钥,对于给定节点,要获取与其关联的节点的成本。 在该计划的后期,我costs填充了值:

{(1)=0, (2)=24, (3)=3, (4)=15}

然后,在代码的后面,当我像这样查询costs时:

 for (int i = 0; i <= g.nNodes; ++i){
            Node tempNode = new Node(i);
            Integer cost = currentPathCosts.get(tempNode);
            System.out.println("cost:"+cost);
        }

我得到了

null
null
null

作为输出。 怎么了?具有相同hashcode()的节点的_id应该是相同的......我错过了什么?

更新

我在equals()方法中缺少 Node other =(Node)n; 。 覆盖对我有用的hashcode()和equals()的方法:

        @Override
        public boolean equals(Object n) {
            if (n == null)
                return false;
            Node other = (Node)n;
            return _id == other._id;
        }
        @Override
        public int hashCode(){
                return _id;
        }

1 个答案:

答案 0 :(得分:4)

@Override方法上添加equals()注释,就像你想要覆盖方法时一样,编译器会告诉你问题是什么。 (对hashCode做同样的事情,而你就是这样)。

你没有覆盖Object.equals()。您正在定义一个不同的,重载的equals()方法。