gpt4 book ai didi

Java:将重复的对象添加到集合中?

转载 作者:太空狗 更新时间:2023-10-29 22:43:27 24 4
gpt4 key购买 nike

如果我运行以下代码,则输出为 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;
}
}

最佳答案

您的 hashcode 方法不会覆盖 Object 类的 hashCode 方法,因此您的 equals 方法违反了契约(Contract),因为它与 hashCode 结果不一致,并且您可以拥有“相等”但具有不同哈希码的对象。

记住:在覆盖方法时,您应该始终使用 @Override 注释,因为这将帮助您捕获此错误和类似错误。

@Override  // ** don't forget this annotation
public int hashCode() { // *** note capitalization of the "C"
return a;
}

此外,您还需要改进代码格式,尤其是在此处发布代码以供我们审核时。如果代码符合标准(这就是存在标准的原因),我们将能够更好地理解您的代码并为您提供帮助。因此,请尽量使缩进与同一 block 中同一级别缩进的所有代码行保持一致,并且您需要确保基本级别的代码,包括导入、外部类声明及其结尾花括号,是左对齐的:

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

关于Java:将重复的对象添加到集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16462644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com