Java Set对象可以原地修改吗?

Can Java Set objects be modified in place?

我正在使用 TreeSet,但我更具体地想知道一般情况下是否可以在不删除条目的情况下修改条目,或者这是否会产生不可预测的行为。基本上,即使修改后的条目没有被删除并重新添加,Set/TreeSet 是否会在内部进行自我重组?

通常,具有某种内部结构的集合不会监视其元素的变化,如果您修改元素(以改变 属性 结构的方式,它们的结构将被破坏基于)。这也适用于 TreeSet。但是,如果正确实现其元素的 hashCode() 方法,HashSet 将处理更改,因为该方法的契约规定对象的哈希码可能永远不会改变。 (从技术上讲,ComparatorComparable 也应该具有 属性,即 compare(a, b)(或 a.compareTo(b))的结果应该始终相同两个元素,如果你的元素或 Comparator 满足,TreeMap 也是安全的。)

简而言之:如果您将元素放入结构化集合中,请确保您所做的更改不会影响集合结构所基于的 property/behavior。这是哪个property/behavior取决于结构。

但是,您可以使用观察者模式自己实现这种行为:您的元素可以是可观察的,并且您可以为您的集合编写一个包装器 class 来侦听其元素的变化。每当一个元素发生变化时,您将其删除,然后将其重新插入。很可能,您需要两个通知:一个在更改之前(删除),一个在更改之后(添加)。