gpt4 book ai didi

java - HashMap - 插入新的相等对象后,先前的键仍然存在

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:21 24 4
gpt4 key购买 nike

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

class Employee{
int id;

Employee(int id){
this.id = id;
}
public int getId() {
return id;
}

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

@Override
public int hashCode(){
return HashCodeBuilder.reflectionHashCode(this);
}

@Override
public boolean equals(Object obj){
return EqualsBuilder.reflectionEquals(this, obj);
}
}
public class P2 {

public static void main(String[] args) {
Employee emp1 = new Employee(10);
Employee emp2 = new Employee(10);
Employee emp3 = new Employee(14);
HashMap<Employee,String> emp = new HashMap();
emp.put(emp1, "Employee1");
emp.put(emp2, "Employee2");
emp.put(emp3, "Employee3");
Set set = emp.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
Employee empl = (Employee)it.next();
System.out.println(emp.get(empl));
}
System.out.println(emp.containsKey(emp1));
System.out.println(emp1.equals(emp2));
System.out.println(emp.get(emp1));
}

}

输出:-

Employee2
Employee3
true
true
Employee2

这里 emp1 和 emp2 是相等的对象。第 2 个输出表示 HashMap 中有 2 个条目(不是 3 个)。当我们在 hashmap 中插入第二个对象(emp2)时,它会删除先前的条目,即 emp1。但第三个输出表示 HashMap 仍然包含键 emp1,第五个输出表示键 emp1 和 emp2 引用 HashMap 中的相同条目。我对 hashmap 的这种行为感到困惑,即条目消失了,但键仍然存在并引用下一个相等的对象。

最佳答案

由于 emp1emp2 具有相同的 id,即 10,因此 apache commons lib 将它们视为相等,并且 hashcode 也相同。所以当你把emp2放入hashmap时,它实际上并没有向hashmap添加一个新的键,它只是将“Employee1”的现有值替换为“Employee2”。由于 emp1 和 emp2 相同,因此在 hashmap 上调用 contains() 方法时,两个对象都会得到 true。为了避免这种情况:

  1. 为您的员工分配不同的 ID
  2. 向员工类别添加更多属性
  3. 让 java 自己决定 hashcode 和 equals,而不是使用 Apache Commons Lib。

我还可以补充一点,您应该使用它们提供的显式流畅 API,而不是依赖 HashCodeBuilder 和 EqualsBuilder 的反射使用。

关于java - HashMap - 插入新的相等对象后,先前的键仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40967585/

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