我正在使用TreeSet,但是如果可以在不删除它的情况下修改条目或者如果这会产生不可预测的行为,那么我更想知道Set一般。基本上,即使修改后的条目没有被删除并重新添加,Set / TreeSet是否会在内部进行重新组织?
答案 0 :(得分:2)
通常,具有某种内部结构的集合不会监视其元素的变化,如果修改元素(以改变结构所基于的属性的方式),它们的结构将被破坏。这也适用于TreeSet
。但是,HashSet
将处理更改,如果其元素的hashCode()
方法正确实现,因为该方法的合同指定对象的哈希代码可能永远不会更改。 (从技术上讲,Comparator
和Comparable
也应该具有compare(a, b)
(或a.compareTo(b)
)的结果对于相同的两个元素应该始终相同的属性,并且如果您的元素或Comparator
满足,TreeMap
也是安全的。)
简而言之:如果将元素放入结构化集合中,请确保不要进行影响集合基于其结构的属性/行为的更改。这取决于结构的属性/行为。
但是,你可以通过使用Observer模式自己实现这种行为:你的元素可以是可观察的,你可以为你的集合编写一个包装类来监听其元素的变化。每当元素发生变化时,您将其删除然后重新插入。很可能,您需要两个通知:一个在更改(删除)之前,另一个在更改之后(添加)。