java - HashSet 允许重复

标签 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());
    }
  }
}

子类

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/

相关文章:

java - 通用 JAXB 到由相同 XML 包装的不同 XML

java - 用java从一个文件读写到另一个文件

java - 使用 java jeromq 的异步客户端/服务器

duplicates - 重复代码 : How to find and remove with tools

python - 在python中识别具有不同列名的重复列值的列

performance - 原始类型 HashSet 或 HashMap 比 Object 快 10 倍?

java - 使用 maven 构建时如何在 osgi 包中导入 javax.smartcardio?

c++ - 如何从数组中删除 2 个连续的重复项? C++

c - 将项目添加到数据结构 (C)

java - Java 中的集合到底什么时候发生变异?