我阅读了关于TreeMap
的以下逻辑:
TreeMap.clone()
方法返回TreeMap
实例的浅表副本。在浅表副本中,对象B指向对象A在内存中的位置。换句话说,对象A和对象B共享相同的元素。键和值本身不会被克隆。
考虑到这一点,我按照链接problem编写了一个程序,在其中我从treemap
克隆对象中删除了一个元素,我的期望是必须从主树图对象中删除该元素。也是,但是没有发生。我也检查了两个对象的键的哈希码,但这是相同的。有人可以让我知道,浅拷贝是TreeMap中的不同之处,还是我的理解是不正确的? JDK-1.8
答案 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" ..
在“深层复制”下,我知道,“键和值”(甚至更深层)也将被克隆。