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());
}
}
}
假设我在我的地图中输入了一个条目,其中包含一个对象作为键:
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());
}
}
}