为什么我的哈希图不起作用?我的对象具有 hashCode() 相等性意味着 equals(...) 相等性的 属性
Why doesn't my hashmap work? My object has the property that hashCode() equality implies equals(...) equality
为什么我的 Java HashMap
不起作用?我的对象具有 属性,.equals
相等意味着 hashCode
相等。
您可以假设我在将对象添加到 HashMap
后修改对象的字段。
如果您在 将对象添加到 HashMap
之后改变(更改)对象 ,您的对象将位于错误的存储桶中。这是因为即使对象已更改,对象在发生更改后也未 "refiled" 到(新的)正确的存储桶中。
因此,像 remove
这样的方法将无法找到您的对象,因为该对象位于过时的存储桶中。
(对我而言)真正推动这个回家的是,当对象最初添加到 HashMap
时,散列值(一个 int)与条目一起存储。这意味着哈希是一个相对静态的 属性,很少(从不)更新。
可能的解决方法包括:
如果您遍历 hashmap
中的每个条目并从这些条目创建一个新的 HashMap
,它可能会起作用。就性能而言,这可能很糟糕,但可能是最正确的做法。
不要在 hashCode
函数中包含正在更改的字段。虽然不是很好(利用未指定的编译器行为充其量是有风险的业务),但它往往会起作用,因为您只会遇到冲突,这只会影响性能,不会影响正确性。您仍然需要在 .equals(Object obj)
方法中包含有问题的字段,否则您最终可能会删除错误的对象。
算法解决方案:找到一种方法将不同的数据存储在充当常量键的对象中。例如,在我的应用程序中,我使用整数字段跟踪对象的 "age"。每次我在我的应用程序中达到一定时间时,我都会增加所有密钥的年龄。如果某物早于 50 个时间单位,那么我可以合理地丢弃键值对。或者,我可以更改对象以存储对象的 "birthtime"。也就是说,如果创建对象时应用程序是 1000 个时间单位,我将存储数字 1000。然后,为了确定对象的年龄,我可以将当前 "time" 与出生时间进行比较并抛出如果差异 > 50,则输出对象。
You can assume that I'm modifying a field of the object after I add the object to the HashMap.
这就是为什么。
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.
"Not specified" 表示 "may not to work",所以当它不起作用时,您不必感到惊讶。
为什么我的 Java HashMap
不起作用?我的对象具有 属性,.equals
相等意味着 hashCode
相等。
您可以假设我在将对象添加到 HashMap
后修改对象的字段。
如果您在 将对象添加到 HashMap
之后改变(更改)对象 ,您的对象将位于错误的存储桶中。这是因为即使对象已更改,对象在发生更改后也未 "refiled" 到(新的)正确的存储桶中。
因此,像 remove
这样的方法将无法找到您的对象,因为该对象位于过时的存储桶中。
(对我而言)真正推动这个回家的是,当对象最初添加到 HashMap
时,散列值(一个 int)与条目一起存储。这意味着哈希是一个相对静态的 属性,很少(从不)更新。
可能的解决方法包括:
如果您遍历
hashmap
中的每个条目并从这些条目创建一个新的HashMap
,它可能会起作用。就性能而言,这可能很糟糕,但可能是最正确的做法。不要在
hashCode
函数中包含正在更改的字段。虽然不是很好(利用未指定的编译器行为充其量是有风险的业务),但它往往会起作用,因为您只会遇到冲突,这只会影响性能,不会影响正确性。您仍然需要在.equals(Object obj)
方法中包含有问题的字段,否则您最终可能会删除错误的对象。算法解决方案:找到一种方法将不同的数据存储在充当常量键的对象中。例如,在我的应用程序中,我使用整数字段跟踪对象的 "age"。每次我在我的应用程序中达到一定时间时,我都会增加所有密钥的年龄。如果某物早于 50 个时间单位,那么我可以合理地丢弃键值对。或者,我可以更改对象以存储对象的 "birthtime"。也就是说,如果创建对象时应用程序是 1000 个时间单位,我将存储数字 1000。然后,为了确定对象的年龄,我可以将当前 "time" 与出生时间进行比较并抛出如果差异 > 50,则输出对象。
You can assume that I'm modifying a field of the object after I add the object to the HashMap.
这就是为什么。
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.
"Not specified" 表示 "may not to work",所以当它不起作用时,您不必感到惊讶。