这里我试图覆盖equals方法和哈希码方法。但containsValue()方法抛出False。即使是重写的哈希码被调用,但我认为equals方法没有被正确调用。请帮帮我。
import java.util.*;
class Test{
int i;
Test(int i)
{
this.i=i;
}
public boolean equals(Test t)
{
if(this.i==t.i){
return true;
}
else{
return false;
}
}
public int hashCode() { //Overriding hashCode class
int result = 17;
result = 37*result + Integer.toString(i).hashCode();
result = 37*result;
return result;
}
}
class TestCollection13{
public static void main(String args[]){
HashMap<Integer,Test> hm=new HashMap<Integer,Test>();
hm.put(1,new Test(1));
hm.put(2,new Test(2));
hm.put(3,new Test(1));
hm.put(4,new Test(4));
for(Map.Entry m:hm.entrySet()){
Test t2=(Test)m.getValue();
System.out.println(m.getKey()+" "+t2.hashCode());
}
System.out.println(hm.containsValue(new Test(2)));
}
}
答案 0 :(得分:1)
equals
应定义为Object
,而不是Test
:
@Override
public boolean equals(Object other)
您可以通过使用@Override
显式注释方法来轻松检测到这种情况,在这种情况下,编译器会检测到此错误。
答案 1 :(得分:1)
您的方法public boolean equals(Test t)
不会覆盖Object.equals(Object)
。您需要更新方法签名并检查类类型:
@Override
public boolean equals(Object o) {
return o instanceof Test
&& ((Test)o).i == this.i;
}
答案 2 :(得分:1)
方法equals()
将Object
作为参数,因此在您的代码中,您不会覆盖equals()
方法,而是重载它。因此,您需要将传入参数更改为Object。你的方法应该是这样的:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Test)) return false;
Test test = (Test) o;
return this.i == test.i;
}
另外,我会为你的i成员添加getter和setter。