我似乎无法让 HashSet
实例按预期工作。我使用的代码如下:
import testing.Subclass;
import java.util.HashSet;
public class tester {
public static void main(String[] args) throws Exception {
HashSet<Subclass> set = new HashSet<Subclass>();
set.add(new Subclass("007812"));
set.add(new Subclass("007813"));
System.out.println("Set size " + set.size());
set.add(new Subclass("007812"));
System.out.println("Set size " + set.size());
for(Subclass sub : set) {
System.out.println(" sub acctNbr " + sub.getAcctNbr());
}
}
}
子类
public class Subclass implements Comparable<Subclass> {
public Subclass(String acctNbr) {
this.acctNbr = acctNbr;
}
private String acctNbr;
public String getAcctNbr() {
return this.acctNbr;
}
public int compareTo(Subclass other) {
return this.getAcctNbr().compareTo(other.getAcctNbr());
}
public boolean equals(Subclass other) {
if(other.getAcctNbr().equals(this.getAcctNbr()))
return true;
else
return false;
}
public int hashCode() {
return acctNbr.hashCode();
}
}
这段代码输出
sross@sross-workstation:~/Documents$ javac testing/Subclass.java
sross@sross-workstation:~/Documents$ javac tester.java
sross@sross-workstation:~/Documents$ java tester
Set size 2
Set size 3
sub acctNbr 007812
sub acctNbr 007812
sub acctNbr 007813
sross@sross-workstation:~/Documents$
最佳答案
您需要覆盖 equals(Object)
。您没有这样做,而是实现了一个带有签名 equals(Subclass)
的 equals
方法。因此,您的 HashSet
使用在 Object
上定义的默认 equals(Object)
方法进行相等性测试。
默认的 equals(Object)
实现是基于对象标识的,因此该集合“允许”您添加两个 String
,它们在语义上是相等的不是同一个对象。
关于java - HashSet 允许重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1663506/