HashSet允许重复

She*_*oss 7 java duplicates hashset

我似乎无法让一个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());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

子类

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

此代码输出

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$
Run Code Online (Sandbox Code Playgroud)

Ada*_*ski 20

你需要覆盖equals(Object).您没有这样做,而是equals使用签名实现了一种方法equals(Subclass).因此,您HashSet使用为相等性测试equals(Object)定义的默认方法Object.

默认equals(Object)实现基于对象标识,因此集合"允许"添加两个Strings,虽然在语义上相同,但它们不是同一个对象.

  • 不要忘记覆盖hashCode(). (5认同)

Bom*_*mbe 5

你没有正确覆盖Object.equals().

@Override
public boolean equals(Object other) {
    if ((other == null) || !(other instanceof Subclass)) {
        return false;
    }
    return ((Sublcass) other).getAcctNbr().equals(this.getAcctNbr());
}
Run Code Online (Sandbox Code Playgroud)

该方法boolean equals(Subclass other)创建了第二种方法,而不是您打算做的.

  • 您不需要检查null,因为`instanceof`对于null引用返回false. (2认同)