HashSet允许重复 [英] HashSet allows duplicates
问题描述
我似乎无法获得 HashSet
实例按预期工作。我使用的代码如下:
import testing.Subclass;
import java.util.HashSet;
public class tester {
public static void main(String [] args)throws异常{
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子类实现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
返回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
设置大小2
设置大小3
sub acctNbr 007812
sub acctNbr 007812
sub acctNbr 007813
sross @ sross-workstation:〜/ Documents $
您需要覆盖 equals(Object)
。而不是这样做,你已经实现了一个等于
方法,具有签名 equals(Subclass)
。因此,您的 HashSet
正在使用 Object $上定义的默认
equals(Object)
c $ c>用于等式测试。
默认的 equals(Object)
实现是基于对象标识,因此集合允许您添加两个 String
,即语义相等的对象不一样。
I can't seem to get a HashSet
instance to work as expected. The code I used is as follows:
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());
}
}
}
Subclass
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();
}
}
This code outputs
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$
You need to override equals(Object)
. Instead of doing this you've implemented an equals
method with signature equals(Subclass)
. Consequently your HashSet
is using the default equals(Object)
method defined on Object
for equality testing.
The default equals(Object)
implementation is based on object identity, and hence the set "allows" you to add two String
s that, whilst semantically equal, are not the same object.
这篇关于HashSet允许重复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!