gpt4 book ai didi

java - 重复的自定义对象被添加到哈希集中

转载 作者:行者123 更新时间:2023-12-01 16:44:15 25 4
gpt4 key购买 nike

我有一个 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”的员工类对象并将其添加到 HashSet 中。之后,我将此现有员工对象的名称修改为“Kieron Pollard”,并将此修改后的员工对象再次添加到哈希集中。

测试集.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]]

因为,set 不允许重复的元素,但在输出中我们在上述场景中得到了重复的元素。那么,处理这种行为的正确方法是什么。

最佳答案

你在这里搬起石头砸自己的脚。

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

如果hashCodeid 定义& name &您在将对象添加到 HashSet 之前更改名称同样,您显然会得到一个重复的条目。提醒:对象的唯一性由 hashCode 决定- 这就是HashSet用于确定对象是否已在 Set 中.

您的独特性标准是什么?如果id意味着是唯一的,仅使用 idhashCode

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

关于java - 重复的自定义对象被添加到哈希集中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55761172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com