TreeMap 会动态更改顺序吗?

问题描述 投票:0回答:2

假设我在地图中放入了一个条目,其中包含一个对象作为键:

treeNode.put(someObject,someValue); 

然后一段时间后,我得到该条目,并更改对象,以便现在如果重新使用它,它会落在地图中的其他位置。

treeNode.get(someObject); 
someObject.change();

我是否必须删除地图中的旧条目,然后重新放置才能使地图与新密钥保持一致?

java oop treenode
2个回答
2
投票

是的,你知道。

TreeMap
不可能知道某个值在地图中的位置应该发生变化。

TreeMap
没有用那么多话表达这一点,但
Map
指定了

如果对象的值以影响比较的方式更改,而该对象是映射中的键,则未指定映射的行为。


equals

记录它使用指定的比较器而不是

TreeMap
    


2
投票

equals

中的元素按照其自然顺序或构造时提供的
TreeMap
存储。

映射根据其键的自然顺序进行排序,或者通过映射创建时提供的比较器进行排序,具体取决于使用的构造函数。

此行为仅在将元素

添加到地图时适用。当修改条目的键时,Comparator类不会执行任何重新排列


事实上,一旦一个对象被用作地图条目的键,就不应该修改它,否则相应的值可能会变得不可追踪(取决于 

TreeMap

compareTo
方法的定义方式) .

之所以如此,是因为 Map 接口是根据 equals 操作定义的,但是有序映射使用其compareTo(或compare)方法执行所有键比较,因此从以下角度来看,通过此方法视为相等的两个键是排序后的地图,相等。

© www.soinside.com 2019 - 2024. All rights reserved.