Java集合对象可以就地修改吗?

Java集合对象可以就地修改吗?,java,set,treeset,Java,Set,Treeset,我正在使用一个树集,但我想知道更具体地说,对于集合来说,是否可以在不删除条目的情况下修改条目,或者这是否会产生不可预测的行为。基本上,如果Set/TreeSet被修改,即使修改的条目没有被删除和重新添加,它是否也会在内部重新组织自身?通常,具有某种内部结构的集合不会监视其元素中的更改,如果修改元素,其结构将被破坏(以更改结构所基于的属性的方式)。这也适用于TreeSet。但是,如果元素的hashCode()方法正确实现,则HashSet将处理更改,因为该方法的契约规定对象的哈希代码可能永远不会更

我正在使用一个树集,但我想知道更具体地说,对于集合来说,是否可以在不删除条目的情况下修改条目,或者这是否会产生不可预测的行为。基本上,如果Set/TreeSet被修改,即使修改的条目没有被删除和重新添加,它是否也会在内部重新组织自身?

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

简而言之:如果将元素放入结构化集合,请确保所做的更改不会影响集合结构所基于的属性/行为。这取决于结构


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

当您说“比较(a,b)(或a.compareTo(b))的结果应始终相同”时你的意思是这两种方法应该始终返回彼此相同的结果,还是在任何两个对象的整个生命周期内,无论何时进行这些比较都应该返回相同的结果?后者。如果你有一个
可比的
类,通常没有必要为它创建
比较器,除非
比较程序rator
执行一种不同类型的比较。这很有趣。我的实现是使用一个磁盘对象来存储一个表示磁盘上文件大小的整数列表,并根据剩余的大部分空间对磁盘进行比较。那么,您是说使用Comparable不合适,因为我将在每个磁盘上添加文件程序的生命周期以及任意两个磁盘之间的比较可能会发生变化?那么正确的方法是什么?我认为“理想的”
比较器的实现
/
Comparable
应该确保两个给定对象的比较结果保持不变,但在实践中,通常不遵循该规则-但是,正如我所说,大多数集合都假设它已被遵循。因此,可以像您所描述的那样制作一个
比较器
,只是不要这样做不要在没有采取额外预防措施的情况下将其用于收藏。