TreeMap 是否动态更改排序?

Does a TreeMap change ordering dynamically?

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

treeNode.put(someObject,someValue); 

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

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

我是否必须删除映射中的旧条目,然后重新放入以使映射与新键保持一致?

是的,你知道。 TreeMap 不可能知道值在地图中的位置应该已经改变。

TreeMap 并没有说这么多,但是 Map 指定

The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map.

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

TreeMap 中的元素根据它们的自然顺序或构造时提供的比较器存储。此规则仅在将元素添加到数据结构时应用。

TreeMap 不会对其键执行任何观察来重新排列自身。如果其中一个键的内部状态发生变化,您将必须手动更新 TreeMap 以尊重其正确的结构。

这是一个例子:

public class Test {
    public static void main(String[] args) {
        TreeMap<StringBuilder, Integer> treeMap = new TreeMap<>();

        StringBuilder str1 = new StringBuilder("a");
        treeMap.put(str1, 32);

        StringBuilder str2 = new StringBuilder("b");
        treeMap.put(str2, 15);

        StringBuilder str3 = new StringBuilder("c");
        treeMap.put(str3, 78);

        System.out.println("Original");
        for (Map.Entry entry : treeMap.entrySet()) {
            System.out.printf("%s => %d%n", entry.getKey(), entry.getValue());
        }

        System.out.println("\nUpdated");
        str2.replace(0, str2.length(), "z");
        for (Map.Entry entry : treeMap.entrySet()) {
            System.out.printf("%s => %d%n", entry.getKey(), entry.getValue());
        }

        treeMap.remove(str2);
        treeMap.put(str2, 15);
        System.out.println("\nRearranged");
        for (Map.Entry entry : treeMap.entrySet()) {
            System.out.printf("%s => %d%n", entry.getKey(), entry.getValue());
        }
    }
}