下面的代码说明了我的问题:
public class TreeMapCopyProblem {
private static TreeMap<Integer, SortedSet<Integer>> treeMap1;
private static TreeMap<Integer, SortedSet<Integer>> treeMap2;
public static void main(String[] args) {
fillTreeMap1();
initializeTreeMap2();
test();
}
private static void initializeTreeMap2() {
treeMap2 = (TreeMap<Integer, SortedSet<Integer>>) treeMap1.clone();
}
private static void fillTreeMap1() {
treeMap1 = new TreeMap<>();
SortedSet<Integer> values0 = Stream.of(0).collect(Collectors.toCollection(TreeSet::new));
SortedSet<Integer> values1 = Stream.of(1).collect(Collectors.toCollection(TreeSet::new));
SortedSet<Integer> values2 = Stream.of(2).collect(Collectors.toCollection(TreeSet::new));
treeMap1.put(0, values0);
treeMap1.put(1, values1);
treeMap1.put(2, values2);
//Once fill, this treeMap does not have to be modified anymore
}
private static void test(){
treeMap2.get(0).add(99);
System.out.println(treeMap1);
}
}
TreeMap1 也被修改,因为它是引用同一集合的浅拷贝。
我使用
也有同样的行为treeMap2 = new TreeMap<>(treeMap1);
那么...我们如何简单地对现有 Tree Map 进行非浅复制,以便我们可以从现有 TreeMap 初始化一个新 TreeMap,然后仅修改第二个 TreeMap?
private static void initializeTreeMap2() {
treeMap2 = (new TreeMap<>());
treeMap1.forEach((integer, integers) -> {
SortedSet<Integer> newSet = new TreeSet<>(integers);
treeMap2.put(integer, newSet);
});
}
这有效。但这是好方法吗?