当对象可变时,TreeSet,HashSet或LinkedHashSet如何表现?我无法想象它们会在任何意义上起作用吗?
如果我在添加对象后修改它;列表的行为是什么?
是否有更好的选择来处理可变对象(我需要排序/索引/等)的集合,而不是链接列表或数组,并且每次只是迭代它们?
答案 0 :(得分:4)
Set
接口直接解决了这个问题:“注意:如果将可变对象用作set元素,必须非常小心。如果在一个对象的值中更改了对象的值,则不会指定集合的行为。当对象是集合中的元素时,影响等于比较的方式。这种禁止的一个特例是,不允许集合将自身包含为元素。“
附录:
处理可变对象集合是否有更好的选择?
在尝试确定哪个集合实现最合适时,可能值得查看core collection interfaces。特别是对于Set
实现,只要正确实现equals()
和hashCode()
,任何不相关的属性都可能是可变的。通过与数据库关系类比,任何属性都可能发生变化,但主键必须是不可侵犯的。
答案 1 :(得分:2)
如果对象的hashCode和比较方法的行为在插入后发生变化,那么可变性只是集合的一个问题。
您可以处理此问题的方法是从集合中删除对象,并在进行此类更改后重新添加它们以便对象。
从本质上讲,这会从集合的角度产生一个不可变的对象。
另一种性能较低的方法可能是保留包含所有对象的集合,并在需要对集合进行排序或索引时创建TreeSet / HashSet。对于对象不断变化并且您需要同时进行地图访问的情况,这不是真正的解决方案。
答案 2 :(得分:0)
处理这种情况的“最佳”方法是保留用于查找的辅助数据结构,有点像数据库中的索引。然后,所有修改都需要确保索引已更新。好的例子是map或multimaps - 在更新之前,从任何索引中删除条目,然后在更新之后将它们添加回新值。显然这需要关注并发等。