从TreeMap克隆对象中删除元素不会从Java

时间:2019-02-03 18:30:56

标签: java clone treemap shallow-copy

我阅读了关于TreeMap的以下逻辑:

TreeMap.clone()方法返回TreeMap实例的浅表副本。在浅表副本中,对象B指向对象A在内存中的位置。换句话说,对象A和对象B共享相同的元素。键和值本身不会被克隆。

考虑到这一点,我按照链接problem编写了一个程序,在其中我从treemap克隆对象中删除了一个元素,我的期望是必须从主树图对象中删除该元素。也是,但是没有发生。我也检查了两个对象的键的哈希码,但这是相同的。有人可以让我知道,浅拷贝是TreeMap中的不同之处,还是我的理解是不正确的? JDK-1.8

1 个答案:

答案 0 :(得分:1)

您的理解有些不正确(根据我的p.o.v ... sry!:)

我的理解是“键和值相同”,但是克隆的映射不是(相同)! 成为地图的一部分的是信息,它既不是键也不是“知道”的值,而是仅地图/容器...,克隆后,此信息(复制并)归每个地图所有。

如果您已经检查了Map.Entry<K, V> ...(这些对于基础键和值也不知道),我会同意您的误解/观察。

克隆之后,如果您希望克隆同步,则您/某人必须确保它。


如果您确实想要同一地图的“两个引用”(预期行为),则“只是”共享/传递对该地图的引用(但要注意并发性,“通常”地图实现不是线程安全的):

 //not: Map<X, Y> copy = original.clone(), but:
 Map<X, Y> ref = original; // then all changes on "original" are "reflected" at "ref" ..

在“深层复制”下,我知道,“键和值”(甚至更深层)也将被克隆。