首页 > 解决方案 > 自定义对象作为 HashMap 中的键

问题描述

众所周知,我们可以使用任何 Object 作为 Java HashMap 中的键,只要它遵循 equals 和 hashCode 协定。但是我在某处读过它——如果自定义对象是不可变的,那么这已经被处理了。这是否意味着如果我的自定义对象是不可变的,我不需要重写 hashcode 和 equals 方法以使其有资格将其用作我的 hashmap 的键。

我的理解是这是错误的,即使我的自定义对象是不可变的,它也必须重写 hashcode 和 equals 方法才能使其符合 hashmap 键的条件。如果你们有不同的看法,请发表评论。

标签: java

解决方案


构造地图不会有问题,而且你的每一个条目,除非对象的哈希码碰撞将是唯一的。但是基于键的搜索将是一个问题。由于它是不可变的,因此您确实无法创建可以匹配地图中的键的键。

{
        HashMap<ImmutableKey, String> map = new HashMap<>();
        ImmutableKey key = new ImmutableKey("A", "B");
        map.put(key, "Test");
        map.put(new ImmutableKey("A", "B"), "Test1");
        map.put(new ImmutableKey("A", "B"), "Test2");
        map.put(new ImmutableKey("A", "B"), "Test3");

        System.out.println(map);
        String data = map.get(new ImmutableKey("A", "B"));
        System.out.println(data);

}

final class ImmutableKey {
    private String key;
    private String value;

    public ImmutableKey(String key, String value) {
        this.key = key;
        this.value = value;
    }

    public String getKey() {
        return key;
    }

    public String getValue() {
        return value;
    }
}

推荐阅读