Java HashMap 没有从键中获取值
Java HashMap is not getting value from key
当我尝试从包含一条记录的散列图中获取错误时,我一直得到 null。最后我通过以下方式对其进行了测试:
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());
}
我得到的输出是:
object from key >> null
direct object >> application.Position@37
我展示的代码是按原样使用的,中间没有任何其他内容。
关于位置对象,我已将 hashCode() 函数覆盖为 return 基于位置 class 的值的 hashCode。因此,当对象内的变量发生变化时,HashCode 也会发生变化。上面的代码在位置对象的值改变之前运行良好。但是一旦我改变了,我就会通过密钥得到一个空值。
参见Map
的相关文档:
Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map.
地图数据结构在插入时检查您的对象以确定它应该存在的位置(对于 HashMap
它检查 hashCode()
并将其放入特定的桶中,对于 TreeMap
它将它与其他键进行比较并将它放在树的特定分支中,等等)。地图提供了高效的查找,因为它们 仅 查看对象的预期位置,而不搜索其他存储桶/树的其余部分。如果您在将对象存储在地图中之后以影响地图存储它的位置的方式改变对象,那么您就打破了地图所做的假设。它会在预期的桶中查找,找不到,然后放弃。
我将更详细地介绍 HashMap
所做的假设及其原因 related answer。
当我尝试从包含一条记录的散列图中获取错误时,我一直得到 null。最后我通过以下方式对其进行了测试:
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());
}
我得到的输出是:
object from key >> null
direct object >> application.Position@37
我展示的代码是按原样使用的,中间没有任何其他内容。
关于位置对象,我已将 hashCode() 函数覆盖为 return 基于位置 class 的值的 hashCode。因此,当对象内的变量发生变化时,HashCode 也会发生变化。上面的代码在位置对象的值改变之前运行良好。但是一旦我改变了,我就会通过密钥得到一个空值。
参见Map
的相关文档:
Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map.
地图数据结构在插入时检查您的对象以确定它应该存在的位置(对于 HashMap
它检查 hashCode()
并将其放入特定的桶中,对于 TreeMap
它将它与其他键进行比较并将它放在树的特定分支中,等等)。地图提供了高效的查找,因为它们 仅 查看对象的预期位置,而不搜索其他存储桶/树的其余部分。如果您在将对象存储在地图中之后以影响地图存储它的位置的方式改变对象,那么您就打破了地图所做的假设。它会在预期的桶中查找,找不到,然后放弃。
我将更详细地介绍 HashMap
所做的假设及其原因 related answer。