- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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 的这种行为感到困惑,即条目消失了,但键仍然存在并引用下一个相等的对象。
最佳答案
由于 emp1
和 emp2
具有相同的 id
,即 10,因此 apache commons lib
将它们视为相等
,并且 hashcode
也相同。所以当你把emp2放入hashmap时,它实际上并没有向hashmap添加一个新的键,它只是将“Employee1”的现有值替换为“Employee2”。由于 emp1 和 emp2 相同,因此在 hashmap 上调用 contains()
方法时,两个对象都会得到 true。为了避免这种情况:
我还可以补充一点,您应该使用它们提供的显式流畅 API,而不是依赖 HashCodeBuilder 和 EqualsBuilder 的反射使用。
关于java - HashMap - 插入新的相等对象后,先前的键仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40967585/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!