在java中,从TreeMap克隆对象中删除元素不会从主TreeMap对象中删除

在java中,从TreeMap克隆对象中删除元素不会从主TreeMap对象中删除,java,clone,treemap,shallow-copy,Java,Clone,Treemap,Shallow Copy,我阅读了以下关于TreeMap的逻辑: TreeMap.clone()方法返回TreeMap实例的浅拷贝。在浅复制中,对象B指向内存中的对象A位置。换句话说,对象A和B共享相同的元素。键和值本身不会被克隆 考虑到这一点,我根据链接制作了一个程序,在该链接中,我从treemap克隆对象中删除了一个元素,我的期望是该元素也必须从主treemap对象中删除,但没有发生。我也为这两个对象检查了密钥的哈希代码,但它是相同的。有人能让我知道,一个浅显的副本在树状图中是不一样的,或者我的理解是不正确的?Jdk

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

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


考虑到这一点,我根据链接制作了一个程序,在该链接中,我从
treemap
克隆对象中删除了一个元素,我的期望是该元素也必须从主treemap对象中删除,但没有发生。我也为这两个对象检查了密钥的哈希代码,但它是相同的。有人能让我知道,一个浅显的副本在树状图中是不一样的,或者我的理解是不正确的?Jdk-1.8

您的理解有点不正确(来自我的p.o.v…sry!)

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

如果您检查了地图条目,我同意您的误解/观察。。。(这些对基础键和值也是未知的)

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


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

//不是:Map copy=original.clone(),而是:
Map ref=原始版本;//然后,“原始”上的所有更改在“参考”处“反映”。。


在“深度复制”下,我理解,“键和值”(甚至更深)也会被克隆。

浅复制意味着原始引用的对象与副本中的对象相同。指向对象的引用本身不是。通过从一棵树中删除一个引用,另一个引用不会受到影响-即使两个引用都指向同一(相同)对象。(顺便说一句,请在这里包括你的代码,谢谢!)我想你说的是深度复制。我已经在描述中给出的链接中提供了我的代码。谢谢不在深度副本中,引用的对象也克隆在浅副本中,而不是克隆。在浅复制中,将克隆引用,但不会克隆引用所引用的对象。(也就是说:只有树本身被克隆)对于代码:链接的代码可能会消失,这使得未来的读者很难理解。所以最好把它放在这里,谢谢。
 //not: Map<X, Y> copy = original.clone(), but:
 Map<X, Y> ref = original; // then all changes on "original" are "reflected" at "ref" ..