首页 > 解决方案 > 带有类对象的哈希图

问题描述

我有一个 Test 类,它的具有相同值(101,“abc”)的对象被创建了两次。我将这两个对象作为键插入到 Hashmap 中。我想了解内部功能,为什么当我的两个键都相同时,我的大小变成了两个地图,它可能应该覆盖?

import java.util.HashMap;
import java.util.Map;
public class Test{
int id;
String name;
public static void main(String[] args) {
Test e1 = new Test(101,"abc");
Test e2 = new Test(101,"abc");
//Test e3 = new Test(101,"abc");
Map<Test, String> map = new HashMap<>();
map.put(e1, "XYZ");
map.put(e2, "CDF");
String value = map.get(e2);
System.out.println( "VALUE : "+value);
}
public Test(int id, String name) {
this.id = id;
this.name=name;
}}

标签: javahashmap

解决方案


Test e1 = new Test(101,"abc");
Test e2 = new Test(101,"abc");

创建 2 个不同类型的Test对象。这意味着已为 e1 和 e2 分配了 2 个不同的内存空间。

现在让我们了解 map(比如 Hash Map)如何识别键的唯一性(用更简单的话说,映射如何知道您尝试插入的键是否已经存在)。答案是,map 调用 hashcode() 和 equals() 方法来比较 map 中存在的键与您尝试插入的键。

我们已经知道所有类都有一个默认的父类Object。并且Test类没有实现 hashcode() & equals(); 所以当map尝试调用它们时,对象类方法被调用了。由于 Object 的类 equals 仅当比较的两个对象都引用相同的对象引用时才返回true并且 hashcode() 也是如此,这里 e1 和 e2 显然是不同的对象。所以你有两个条目。

解决方案是按照上面@Kapil 的建议覆盖equals() 和hashcode()。


推荐阅读