很抱歉,如果这是基本的,但我正在启动java,这不是任何任务,但为什么我的简单测试程序失败?
static public class pair
{
public int x;
public int y;
public pair(int a , int b)
{
x = a;
y = b;
}
}
public static void main(String args[])
{
HashMap<pair,Integer>m = new HashMap<pair,Integer>();
m.put(new pair(1,2), 3);
if(m.containsKey(new pair(1,2)))
{
System.out.println("is there " + m.get(new pair(1,2)));
}
}
答案 0 :(得分:4)
很明显 - 你没有在你命名严格的对类中重写equals和hashCode。
阅读Joshua Bloch&#34; Effective Java&#34;的第3章。看看如何正确地做到这一点。
深浅不等的区别。如果不重写等于,则比较对象引用。对具有相同数据的两个实例的引用是不同的;他们并不浅薄。
new pair(1,2).equals(new pair(1,2)) // returns false
new pair(1,2) == new pair(1,2) // returns false
如果你正确地执行它,当你重写equals以比较类的内容时。
new pair(1,2).equals(new pair(1,2)) // will return true after override
new pair(1,2) == new pair(1,2) // returns false
学习并遵循Java编码标准:应该是Pair
,而不是pair
。
您的Pair
课程作为通用课程会更有用:
public class Pair<U, V> {
public final U u;
public final V v;
public Pair<U, V>(U foo, V bar) {
this.u = foo;
this.v = bar;
}
// override equals and hashCode
}
JDK8中是否有Pair
类?有趣的讨论here。