作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
主要问题
我有一个填充了顶点对象的哈希图。基于整数(即 1),我想找到那个顶点对象。请参阅下面的代码:
public class Playground {
public static void main(String[] args) {
Map<Vertex, String> map1 = new HashMap<Vertex, String>();
Map<Integer, String> map2 = new HashMap<Integer, String>();
Vertex v1 = new Vertex(5);
map1.put(v1, "1");
Vertex v2 = new Vertex(5);
String s = map1.get(v2);
System.out.println(s);
Integer int1 = new Integer(1);
map2.put(int1, "2");
Integer int2 = new Integer(1);
String t = map2.get(int2);
System.out.println(t);
}
}
class Vertex{
public int id;
public Vertex(int id){
this.id = id;
}
@Override
public boolean equals(Object obj) {
Vertex v = (Vertex) obj;
return (this.id == v.id);
}
}
最佳答案
您需要覆盖 hashCode
方法使 JVM 正确存储和检索 HashMap 中的对象。
当对HashMap等散列集合调用put方法时,会调用key对象hashcode方法来决定存储对象的桶。然后调用它的 equals 方法来查看那里是否已经存在某些东西。
类似地,当您在 HashMap 上执行 get 时,将调用关键的 hashCode 方法来查找存储桶并检索对象。
由于您尚未覆盖 Vertex 类中的 hashcode 方法,因此使用了默认的 hashcode 实现。因此,具有相同 id 值的两个 Vertex 对象可能具有不同的哈希码。
阅读此相关文章以了解如何覆盖 equals 和 hashcode 方法:
What issues should be considered when overriding equals and hashCode in Java?
您可以在 google 上找到相同主题的不同文章。一个很好的谷歌结果:
http://javarevisited.blogspot.in/2011/02/how-to-write-equals-method-in-java.html
关于java - 如何在不引用实际对象的情况下在 HashMap 中查找对象? (从 TextFile 加载有向图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17977296/
我是一名优秀的程序员,十分优秀!