如果我运行以下代码,则输出为2,这意味着该集合包含2个元素。但是我认为该集应该包含1,因为两个对象基于 hashcode()值以及.equals()
方法是相等的。
在我的理解中似乎有些明显的错误?
package HELLO;
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) throws Exception {
Set<Alpha> s = new HashSet<Alpha>();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
s.add(a1);
s.add(a2);
System.out.println(s.size());
}
}
class Alpha {
int a = 10;
public int hashcode() {
return a;
}
public boolean equals(Object obj) {
return (obj instanceof Alpha && ((Alpha) obj).a == this.a);
}
public String toString() {
return "Alpha : " + a;
}
}
答案 0 :(得分:28)
你的hash c ode方法不会覆盖Object类的hash C ode方法,因此你的equals方法会破坏契约,因为它与hashCode结果不一致,并且您可以拥有“相等”但具有不同hashcode的对象。
请记住:在覆盖方法时应始终使用@Override
注释,因为这可以帮助您捕获此类错误。
@Override // ** don't forget this annotation
public int hashCode() { // *** note capitalization of the "C"
return a;
}
此外,您还需要改进代码格式,尤其是在此处发布代码以供我们审核时。如果符合标准(这就是标准存在的原因),我们将能够更好地理解您的代码并为您提供帮助。因此,请尝试使缩进与同一块中同一块中缩进的所有代码行保持一致,并且您需要确保基本级代码(包括导入,外部类声明及其结束大括号)是向左刷新的:
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) throws Exception {
Set<Alpha> s = new HashSet<Alpha>();
Alpha a1 = new Alpha();
Alpha a2 = new Alpha();
s.add(a1);
s.add(a2);
System.out.println(s.size());
}
}
class Alpha {
int a = 10;
@Override
public int hashCode() {
return a;
}
public String toString() {
return "Alpha : " + a;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Alpha other = (Alpha) obj;
if (a != other.a)
return false;
return true;
}
}
如需对此进行精彩评论,请阅读:Overriding equals and hashCode in Java
答案 1 :(得分:4)
您的方法哈希码应命名为 hashCode (大写字母“C”)。
如果您计划覆盖方法,则应使用@Override
注释。
如果您使用过该注释,那么您之前已经注意到了该问题,因为代码无法编译。
答案 2 :(得分:3)
@Overrides注释将覆盖超类中具有相同名称的方法“。
@Override
public int hashCode() {
return a;
}
@Override
public boolean equals(Object obj) {
return (obj instanceof Alpha && ((Alpha) obj).a == this.a);
}
@Override
public String toString() {
return "Alpha : " + a;
}