Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用哈希表的问题_Java_Map_Hashmap_Hashtable - Fatal编程技术网

在Java中使用哈希表的问题

在Java中使用哈希表的问题,java,map,hashmap,hashtable,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 Stri

我试图使用哈希表,当我试图搜索一个对象时,我看不到该对象,但如果我打印它,我可以看到它

节点类:

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

    }
}
公共类GridWalk{
静态哈希表myMap;
静态堆栈节点;
公共静态void main(字符串[]args){
myMap=新哈希表();
节点=新堆栈();
节点开始=新节点(0,0);
节点new1=新节点(100100);
put(new1,新整数(1));
节点new2=新节点(100100);
System.out.println(“已经存在了?嗯:“+myMap.get(new2))处的+new2.toString()+”;
}
}

当我打印行时,我得到了空值。知道为什么吗?

您需要在节点类中重写并实现
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依赖于
equals
hashCode
方法的正确实现来正确操作。您应该实现反映对象逻辑的
equals
方法。比如:

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

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

您可能还希望在
节点
对象上实现
hashCode()
方法。

您需要在节点类中重写并实现
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依赖于
equals
hashCode
方法的正确实现来正确操作。您应该实现反映对象逻辑的
equals
方法。比如:

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

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

您可能还想在
节点
对象上实现一个
hashCode()
方法。

因此,该方法应该类似于:Boolean equals(Node node1,Node node2),对吧?明白了:public Boolean equals(object obj){return(this==obj);}否。它需要在
节点
类中,并具有确切的签名
布尔等于(对象)
。否
公共布尔等于(对象o)
。您可以将
o
转换为
节点
对象,并将其与
进行比较
this==obj
对您没有帮助,因为它是默认的
对象。无耻地登广告。您可以使用右菜单“Traduzir”组合框翻译文章。@Perception:它不是“您可能还想实现
hashCode()
方法”;它是“您还必须实现
hashCode()
方法”。如果覆盖
equals
但不覆盖
hashCode
,则它们将不一致,并最终导致
HashMap
中未定义的行为。因此,该方法应该类似于:Boolean equals(Node node1,Node node2),对吗?明白了:public Boolean equals(Object obj){return(this==obj);}否。它需要在
节点
类中,并具有确切的签名
布尔等于(对象)
。否
公共布尔等于(对象o)
。您可以将
o
转换为
节点
对象,并将其与
进行比较
this==obj
对您没有帮助,因为它是默认的
对象。无耻地登广告。您可以使用右菜单“Traduzir”组合框翻译文章。@Perception:它不是“您可能还想实现
hashCode()
方法”;它是“您还必须实现
hashCode()
方法”。如果覆盖
equals
而不是
hashCode
,则它们将不一致,并且您将从
HashMap
中得到未定义的行为。