在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
中得到未定义的行为。