内部对象更改时HashSet的哈希解决方法

AHu*_*ist 5 java collections hash set hashcode

这个SO的答案解释了我遇到的问题:HashSet.remove()和Iterator.remove()无法正常工作

基本上,一旦我向HashSet添加了一些东西,如果我修改了它的任何字段,那么该集合将使用包含具有完全相同字段的对象的集合的任何相等性测试失败,因为它存储的哈希码是用于它的时候设置了不同的字段.

那么,既然这个答案解释了正在发生什么,那么为什么一个好的解决方法是既具有使用集合的唯一性又能够修改集合中对象的内部字段?或者这是不可能的?

NPE*_*NPE 7

如果您修改的字段不是相等性测试的一部分,则它们也不应该是哈希代码计算的一部分.在这种情况下,没有问题:您可以修改这些字段.

如果字段相等测试的一部分,那么最干净的方法可能是从集合中删除对象,然后修改并重新插入它.

如果是后者,并且您发现自己做了很多,那么您可能希望重新访问手头问题的数据结构选择.


Mar*_*ers 6

从集中删除要修改的对象,更改它,然后将其添加回来.据我所知,没有标准的Set实现可以处理存储时被更改的字段(在hashCode()compareTo()实现中使用).

或者,如果字段用于确定身份,相等或位置(即未使用hashCode(),compareToequals()),则没有问题.