如何在java Set中存储唯一的对象以避免重复?
例如
考虑 Employee 对象(员工 ID、姓名、薪水......)
Set 中需要添加的对象的员工列表。 我们需要限制 Set 中需要通过“员工 ID 来识别”的重复元素。
最好的方法是什么?
如果您使用
java.util.Set
的实现,只要您的 equals
和 hashCode
方法正确实现,它就不应该允许重复。但不确定为什么你的问题上有 hashmap 和 hashtable 作为标签。也许您应该重新表述您的问题并添加给您带来问题的代码?
编辑:考虑您的编辑:
如果您使用
Set
,您的员工应具有以下方法:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@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 == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
与@Dirk类似,您也可以使用org.apache.commons中的HashCodeBuilder和EqualsBuilder。
它看起来像这样:
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(id)
.append(name)
.append(salary)
.toHashCode();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Employee) {
final Employee employee = (Employee) obj;
return new EqualsBuilder()
.append(id, employee.id)
.append(name, employee.name)
.append(salary, employee.salary)
.isEquals();
} else {
return false;
}
}
“要在 Set 中存储唯一的用户定义对象,您必须显式地重写 [hashCode] 和 [equals] 方法 以学生详细信息为例”
@Override
public int hashCode(){
return this.id;
}
@Override
public boolean equals(Object obj)
{
return this.hashCode==((Student)obj).hashCode();
}
Set 仅存储唯一对象
例如:
Set set = new HashSet();
// Add elements to the set
set.add("a");//true
set.add("b");//true
set.add("c");//true
set.add("d");//true
set.add("a");//false
当你尝试存储已经在 Set 中的对象时,add 将返回 false