当前位置: 首页 > 知识库问答 >
问题:

将重复的自定义对象添加到哈希集

佘辰龙
2023-03-14

我有一个Employee类有2个属性id和name。我正在重写hashcode和equals方法,如下所示。

Employee.java:

import java.util.Objects;

public class Employee {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee other = (Employee) obj;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Employee [id=" + id + ", name=" + name + "]";
    }
}

现在我有了一个测试类,我正在创建一个名为“Chris Gayle”的employee类的对象,并将其添加到HashSet中。之后,我将这个现有的employee对象的名称修改为“Kieron Pollard”,并将这个修改后的employee对象再次添加到HashSet中。

testset.java

import java.util.HashSet;
import java.util.Set;

public class TestSet {

 public static void main(String[] args) {
     Set<Employee> hashSet = new HashSet<Employee>();

     Employee emp1 = new Employee();
     emp1.setId(1);
     emp1.setName("Chris Gayle");

     hashSet.add(emp1);

     System.out.println(hashSet);

     emp1.setName("Kieron Pollard");
     hashSet.add(emp1);
     System.out.println(hashSet.size());
     System.out.println(hashSet);
}

}
[Employee [id=1, name=Chris Gayle]]
2
[Employee [id=1, name=Kieron Pollard], Employee [id=1, name=Kieron Pollard]]

共有1个答案

东方俊力
2023-03-14

你在这里开枪打自己的脚。

@Override
public int hashCode() {
    return Objects.hash(id, name);
}

如果hashcode是由idname定义的&在将对象再次添加到hashset之前更改名称,显然会得到一个重复的条目。提醒:对象的唯一性是由hashcode确定的,这就是hashset用来确定对象是否已经在set中。

你的唯一性标准是什么?如果id是唯一的,则仅在hashcode中使用id

@Override
public int hashCode() {
    return Objects.hash(id);
}
 类似资料:
  • 我设置整数对类如下: 当我将它们添加到hashset中时,没有重复: 但它给了我这样的输出: 我应该编辑什么以使哈希集中没有重复项?

  • 我想获取一个Javascript对象并将其转换为哈希数组。 以下操作仅获取对象的一个元素并将其转换为数组: 返回: 但是,当我试图创建散列元素来组成数组时,出现了一个错误: 返回: 我做错了什么?

  • 问题内容: 我是Java的初学者,正在尝试创建自定义类的数组。假设我有一个名为car的类,并且我想创建一组称为Garage的汽车。如何将每辆车添加到车库?这就是我得到的: 问题答案: 如果要使用数组,则必须保留一个包含车库中汽车数量的计数器。最好使用而不是数组:

  • VisualStudio为window对象内置了大多数typescript定义,因为它们大多数都可以工作。但是,“window.chrome”没有定义。如何将其添加到现有的typescript定义中,以便让Visual Studio进行编译?

  • 问题内容: 有谁知道为什么1.1.5版会自动在您的网址中添加井号,以及如何将其关闭?海事组织这看起来很丑。只要您的网址不以正斜杠结尾,它就会发生。(我没有使用路线之类的东西)。 所以这: 变成 还有这个: 变成: 但是这个: 没有这个问题。 问题答案: 前几天,我遇到了这个问题。我通过为启用HTML5模式解决了该问题。看到 $ location的文件- HTML5模式 更新了$ location-

  • 你好,我可能监督了一些事情,但事情是这样的 我有一个