HashMap为Integer键返回错误的值

时间:2016-02-04 06:17:23

标签: java hashmap

我有一个HashMap以下HashMap

private Map<Integer, List<CustomClass>> map = new HashMap<>();

我正在尝试在HashMap中添加一个针对Integer键的新条目,如果该键存在,那么我想获取相应的列表并在其中添加新项。代码如下。

        if (this.map.containsKey(//Integer Key)) {
            this.map.get(//Integer Key).add(//New List Item);
        } else {
            List<CustomClass> customClass = new ArrayList<>();
            customClass.add(new CustomClass());
            this.map.put(//Integer Key, customClass);
        }

真正的问题在于密钥已经存在的部分,我尝试使用HashMap获取函数

this.map.get(//Integer Key).add(//New List Item);

如果找不到Integer键的值,它不会给null,但它经常给出错误的ArrayList。现在我知道HashMap使用equals和hashCode,所以我试图覆盖这些函数并使用它们而不是Integery Key。

public class CustomHashMapIntegerKey {

    private Integer key = 0;

    public void setKey(Integer key) {
        this.key = key;
    }

    public Integer getKey() {
        return this.key;
    }

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (null == obj) return false;
        if (this.getClass() != obj.getClass()) return false;
        final CustomHashMapIntegerKey customHashMapIntegerKey = (CustomHashMapIntegerKey) obj;
        if (null == this.key && null != customHashMapIntegerKey.getKey()) return false;
        if (null != this.key) {
            if (!this.key.equals(customHashMapIntegerKey.getKey())) return false;
        }
        return true;
    }
}

并改变了我的地图以使用这个新的类而不是Integer,但我仍然坚持HashMap提供错误值的同一个问题。这个链接https://gist.github.com/MAnfal/dc581234ce597a8ff062

提供了一些详细的剪辑

2 个答案:

答案 0 :(得分:2)

HashMap部分依赖于equalshashCode来完成其工作,但它有点复杂。请查看this article以获得深入解释。

对于您的purose(以列表作为其值的地图),我建议您使用Google的Guava库中的Multimap

ListMultimap<Integer, String> multimap = ArrayListMultimap.create();
multimap.put(4, "Is the first digit of '4'");
multimap.put(4, "Is the first digit of '42'");
multimap.put(4, "Is the first digit of '4711'");
multimap.put(1, "Is the first digit of '13'");

Collection<String> values = multimap.get(4);

Collection values将包含您在密钥4下添加的三个元素。

答案 1 :(得分:0)

我怀疑地图中存储的值。使用您提供的详细信息,您的问题可能只发生在一种情况下,您必须在不同的列表中添加相同的对象并使用HashMap中的不同键存储。记录您的地图内容,并打印可能对您有帮助的对象哈希码