当我试图从具有一条记录的hashmap中获取错误时,我一直变为空.最后我用以下方式测试它:
Iteratorit = pieces.keySet().iterator(); while (it.hasNext()){ System.out.println("object from key >> " + pieces.get(it.next())); } Iterator itt = pieces.values().iterator(); while (itt.hasNext()){ System.out.println("direct object >> " + itt.next().getPosition()); }
我得到的输出是:
object from key >> null direct object >> application.Position@37
我已经显示的代码被使用,因为它之间没有任何其他东西.
关于位置对象,我重写了hashCode()函数,以根据Position类的值返回hashCode.因此,当对象中的变量发生变化时,HashCode会发生变化.上面的代码在位置对象的值更改之前很有效.但是一旦我改变了,我就会通过密钥获得空值.
请参阅相关文档Map
:
注意:如果将可变对象用作映射键,则必须非常小心.如果在对象是地图中的键的情况下以影响等于比较的方式更改对象的值,则不指定映射的行为.
地图数据结构在插入时检查您的对象,以确定它应该存在的位置(因为HashMap
它检查hashCode()
并将其放入特定的存储桶中,因为TreeMap
它将其与其他键进行比较并将其放在树的特定分支中,等等.).地图提供有效的查找,因为它们只查看对象的预期位置,而不搜索树的其他存储桶/其余部分.如果在将对象以影响地图存储位置的方式存储在地图中之后对其进行变异,则可以打破地图所做的假设.它会看到预期的桶,找不到它,然后放弃.
我HashMap
在这个相关答案中详细介绍了假设的原因和原因.