带有可变对象的Java集合

时间:2010-08-29 06:19:25

标签: java list collections mutable

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

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

是否有更好的选择来处理可变对象(我需要排序/索引/等)的集合,而不是链接列表或数组,并且每次只是迭代它们?

3 个答案:

答案 0 :(得分:4)

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

附录:

  

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

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

答案 1 :(得分:2)

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

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

从本质上讲,这会从集合的角度产生一个不可变的对象。

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

答案 2 :(得分:0)

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