包含 class 个对象的哈希图

Hashmap with class objects

我有一个测试 class,其具有相同值 (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;
}}

哈希图中将有两个对象,除非您在测试中重写 hashcode() 和 equals() 方法 class。如果您在 Test class 的 id 属性 上覆盖这两个方法,那么具有相同 id 的两个键将被视为重复,您将看到预期的行为。

下面的示例说明如果两个对象的 ID 相等,您希望它们相等 -

@Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + id;
            return result;
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Test other = (Test) obj;
            if (id != other.id)
                return false;
            return true;
        }
Test e1 = new Test(101,"abc");
Test e2 = new Test(101,"abc");

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

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

我们已经知道所有 classes 都有一个默认父对象 class ObjectTest class 没有实现 hashcode() & equals();所以当 map 尝试调用它们时,对象 class 方法被调用。 由于对象的 class 等于 returns true 仅当比较中的两个对象都引用相同的对象引用时,hashcode() 也是如此,这里的 e1 和 e2 是明显不同的对象。所以你有两个条目。

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