Java HashMap没有从key获得价值

时间:2015-12-03 17:52:27

标签: java dictionary hash hashmap hashcode

当我试图从具有一条记录的hashmap中获取错误时,我一直变为空。最后我用以下方式测试了它:

ACE_OS::set_errno_to_last_error ();

我得到的输出是:

Iterator<Position> it = pieces.keySet().iterator();
    while (it.hasNext()){
        System.out.println("object from key >> " + pieces.get(it.next()));
    }
    Iterator<Piece> itt = pieces.values().iterator();
    while (itt.hasNext()){
        System.out.println("direct object >> " + itt.next().getPosition());
    }

我所使用的代码原样使用,其间没有任何其他内容。

关于位置对象,我已经重写了hashCode()函数,以根据Position类的值返回hashCode。因此,当对象中的变量发生变化时,HashCode会发生变化。上面的代码在位置对象的值更改之前很有效。但是一旦我改变了,我就会通过密钥获得空值。

1 个答案:

答案 0 :(得分:5)

请参阅Map的相关文档:

  

注意:如果将可变对象用作映射键,则必须非常小心。如果在对象是地图中的键时,以影响等于比较的方式更改对象的值,则不指定映射的行为。

地图数据结构会在插入时检查您的对象,以确定它应该存在的位置(对于hashCode()它检查TreeMap并将其放入特定存储区,{{1}它将它与其他键进行比较,并将其放在树的特定分支中,等等。地图提供有效的查找,因为它们查看对象的预期位置,并且不会搜索树的其他存储桶/其余部分。如果在将对象以影响地图存储位置的方式存储在地图中之后对其进行变异,则可以打破地图所做的假设。它会看到预期的桶,找不到它,然后放弃。

我详细介绍了HashMap假设的假设以及related answer中的原因。