9

当对象是可变的时,TreeSet、HashSet 或 LinkedHashSet 的行为如何?我无法想象它们会在任何意义上起作用吗?

如果我在添加对象后修改它;列表的行为是什么?

除了链表或数组之外,是否有更好的选择来处理可变对象的集合(我需要对其进行排序/索引/等)并且每次都简单地遍历它们?

4

3 回答 3

4

Set接口直接解决了这个问题:“注意:如果将可变对象用作集合元素,则必须非常小心。如果对象的值以影响等于比较的方式更改,则不指定集合的​​行为,而对象是集合中的一个元素。这个禁令的一个特殊情况是不允许集合包含自己作为一个元素。

附录:

处理可变对象集合是否有更好的选择?

在尝试确定最适合的集合实现时,可能值得查看核心集合接口。特别是对于Set实现,只要equals()hashCode()被正确实现,任何不相关的属性都可能是可变的。类比数据库关系,任何属性都可能发生变化,但主键必须是不可侵犯的。

于 2010-08-29T06:42:13.030 回答
2

如果对象的 hashCode 和 compare 方法的行为在插入后发生变化,那么可变性只是集合的问题。

您可以处理此问题的方法是从集合中删除对象并在进行此类更改后重新添加它们,以便对象。

从集合的角度来看,本质上这会导致一个不可变的对象。

另一种性能较低的方法可能是保留一个包含所有对象的集合,并在您需要对集合进行排序或索引时创建一个 TreeSet/HashSet。对于对象不断变化并且您需要同时访问地图的情况,这不是真正的解决方案。

于 2010-08-29T06:39:33.833 回答
0

处理这种情况的“最佳”方法是保留辅助数据结构以供查找,有点像数据库中的索引。然后您的所有修改都需要确保索引已更新。很好的例子是地图或多地图 - 在更新之前,从任何索引中删除条目,然后在更新之后将它们添加回新值。显然,这需要注意并发等。

于 2010-08-29T10:19:25.717 回答