当前位置: 首页 > 面试题库 >

HashSet允许重复

闾丘博超
2023-03-14
问题内容

我似乎无法使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带有signature
的方法equals(Subclass)。因此,您HashSet使用的是为相等性测试equals(Object)定义的默认方法Object

默认equals(Object)实现基于对象标识,因此,该集合“允许”您添加两个String在语义上相等的不同对象。



 类似资料:
  • 我正在检查< code>HashSet的< code>add方法。有人提到 如果该集合已经包含元素,则调用保持集合不变,并返回false。 但是方法在内部保存中的值 的方法声明 将指定值与该映射中的指定键相关联。如果映射先前包含该键的映射,则旧值将被替换。 那么,如果 的 方法替换了旧值,那么 方法如何在元素重复的情况下保持集合不变?

  • 该程序将两个元素都添加到Set中。起初我很震惊,因为在向set添加方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后它没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc表示,它在向集合中添加时只检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为一个HashMap,在这个map中,对象的hashCode被用作键。

  • 问题内容: 该程序将两个元素都添加到集合中。起初我很震惊,因为在添加设置方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc说它在添加到Set中时仅检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为HashMap,并且在地图中,对象的hashCode用作键。因此,

  • 问题内容: 我需要对元素进行排序,但不会删除重复项。 我已经去了,因为实际上将值添加到支持的: 然后TreeMap使用 逻辑删除重复项 我写了一个在元素相等的情况下返回1而不是0的a 。因此,在元素相等的情况下,带有此元素将不会覆盖重复项,而只会对其进行排序。 我已经为简单对象测试过,但是我需要一组自定义对象。 这种方法是好的还是有更好的方法来实现呢? 编辑 实际上,我有以下类的ArrayList

  • 问题内容: 编辑:当我说“ SQL Server”时,我实际上是在谈论Management Studio。 抱歉,这令人困惑。 哦,我讨厌这种事情发生。昨天我在使用SQL Server,并尝试使用PIVOT命令来弄清楚它是如何工作的。因此,我创建了一个包含四列的新表,第一列的前几行将具有相同的值。 我在第一行,第一列中添加了“ value1”,然后按回车键–因为还没有添加任何键或约束,它使我可以向

  • 我一直在捕捉非数字时遇到问题。 我试过了,但抓不住。如果我让它捕获非数字,但不让用户再次尝试输入。。。它完全停止了我的代码。 这是我的密码: