以下地图的第一个值应被第三个值覆盖,但不是。为什么?
import java.util。*;
class A
{
int a, b;
A(int a,int b) {
this.a = a;
this.b = b;
}
public boolean equals(A aa) {
if(this.a == aa.a && this.b == aa.b) {
return true;
}
return false;
}
public int hashCode() {
return this.a-this.b;
}
}
主类
public class MyClass { // main class
public static void main(String args[]) { // main method
Map<A,Character> map = new LinkedHashMap<>();
map.put(new A(1,2),'a'); //first
map.put(new A(1,3),'b'); //second
map.put(new A(1,2),'v'); //third
for(A a : map.keySet()) {
System.out.println(a.a+" "+a.b+" "+map.get(a));
}
}
}
代码输出为:
1 2 a
1 3 b
1 2 v
您正在重载 equals
方法,而不是重载。正确的签名是equals(Object)
:
public boolean equals(Object o) {
if (!o instanceof A) {
return false;
}
A aa = (A) o;
if(this.a == aa.a && this.b == aa.b) {
return true;
}
return false;
}
将来避免这些错误的一个好方法是用@Override
注释注释您尝试覆盖的方法-如果您的签名错误,如此处一样,编译器将发出错误。