Java HashMap未从键获取值

Java HashMap未从键获取值,java,dictionary,hash,hashmap,hashcode,Java,Dictionary,Hash,Hashmap,Hashcode,当我试图从带有一条记录的hashmap中获取错误时,我一直得到null。最后,我用以下方法对其进行了测试: Iterator<Position> it = pieces.keySet().iterator(); while (it.hasNext()){ System.out.println("object from key >> " + pieces.get(it.next())); } Iterator<Piece>

当我试图从带有一条记录的hashmap中获取错误时,我一直得到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());
    }
我展示的代码是按原样使用的,中间没有任何其他内容


关于position对象,我已经重写了hashCode()函数,以基于position类的值返回hashCode。因此,当对象中的变量发生变化时,哈希代码也随之变化。在更改位置对象的值之前,上述代码运行良好。但是一旦我改变了密码,我就会通过密钥得到一个空值

有关以下内容,请参阅相关文档:

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

映射数据结构在插入时检查对象,以确定其应该位于何处(对于
HashMap
它检查
hashCode()
并将其放入特定的bucket中,对于
TreeMap
它将其与其他键进行比较,并将其放入树的特定分支中,等等)。映射提供了高效的查找,因为它们只查找对象的预期位置,而不搜索树的其他bucket/rest。如果在将对象存储在地图中后以影响地图存储位置的方式对其进行变异,则会打破地图所做的假设。它会在预期的桶中寻找,而不是找到它,然后放弃


我将更详细地介绍HashMap的假设及其原因。

请参阅相关文档:

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

映射数据结构在插入时检查对象,以确定其应该位于何处(对于
HashMap
它检查
hashCode()
并将其放入特定的bucket中,对于
TreeMap
它将其与其他键进行比较,并将其放入树的特定分支中,等等)。映射提供了高效的查找,因为它们只查找对象的预期位置,而不搜索树的其他bucket/rest。如果在将对象存储在地图中后以影响地图存储位置的方式对其进行变异,则会打破地图所做的假设。它会在预期的桶中寻找,而不是找到它,然后放弃


我将更详细地介绍
HashMap
所做的假设以及其中的原因。

一旦键位于
Map
中,您绝对不能更改计算
hashCode
的任何值。您必须
删除
并重新
添加
键。那么您的意思是说,当我调用HashMap的get()函数时,HashMap对象在插入时保存hashCodes,而不调用hashCode()函数?您认为
HashMap
是如何工作的?它是如何实现(摊销)
O(1)
性能的?我不知道HashMap是如何工作的。这就是我问的原因。我也不知道它的表演顺序。那么,它不是每次调用get()时都调用hashCode()函数吗。它应该能回答你所有的问题。从开始而不是直接到这里也很有帮助。一旦键位于
映射中,您绝对不能更改计算
hashCode
的任何值。您必须
删除
并重新
添加
键。那么您的意思是说,当我调用HashMap的get()函数时,HashMap对象在插入时保存hashCodes,而不调用hashCode()函数?您认为
HashMap
是如何工作的?它是如何实现(摊销)
O(1)
性能的?我不知道HashMap是如何工作的。这就是我问的原因。我也不知道它的表演顺序。那么,它不是每次调用get()时都调用hashCode()函数吗。它应该能回答你所有的问题。这也有助于从这里开始,而不是直接来到这里。
object from key >> null
direct object >> application.Position@37