2017-10-17 91 views
0

的考虑,我有被定义的驱动程序功能foo()如下:范围浅层复制

void foo() 
{ 
    Map<Integer,Character> map = new HashMap<Integer,Character>() ; 
    bar(map) 
    //operations on map 
} 
void bar(Map<Integer,Character> map) 
{ 
    Map<Integer,Character> map2 = new HashMap<Integer,Character>(map) ; 
    //operations over map2 
} 

现在,据我所知,在map2操作应改变原来的map,因此操作在mapfoo()将是对不同版本的map比原来的一个。 原因我的信念:

  1. this后,我们可以说,我们正在做的哈希表的shallow copy
  2. this文档,其中可以清楚地表示:

参考数据类型参数,如对象,也传递到 方法由值。这意味着当方法返回时, 传入引用仍然引用与之前相同的对象。 但是,如果对象的字段的值具有适当的访问级别,则可以在 方法中更改对象字段的值。

因此,因为我们是在做一个浅拷贝,在复制操作将最终改变传递的地图,所有的变化在此通过地图将反映在原始地图,因为2点

但我有一个矛盾的例子,质疑我的理解。那么,我的想法是否正确?或者还有别的东西呢?

+2

我真的不跟着你不是String对象。复制意味着与英文相同的东西。如果您制作文档的副本并修改副本,则原始文档保持不变。这是副本的重点。所以不,对map2的更改不会使任何变换映射。顺便说一下,你可以轻松地进行实验和测试。 –

+4

浅层或深层复制在这里并不重要:地图只包含不可变的值。 –

+1

定义你所说的“改变传递图”。如果你的意思是它的设定键/值,那么他们不会为'map2'当您添加或删除'map'到/一键改变的意思。如果你指的是实际当你改变它们的状态(例如通过set方法)时,键或值对象的状态,那么它们将会反映在两个地图中,因为这两个地图都会引用相同的键/值对象 – tsolakp

回答

-2

从另一个地图初始化一个HashMap不会导致浅表副本。新的地图对象将拥有自己的数据表,因此删除或添加条目不会影响两个地图。然而,在这两个地图键和值的对象将是相同的,从而对键和值对象的任何操作将是可见的两个提供的对象都不是一成不变的和

+1

你所描述的正是浅拷贝。所以,是的,拷贝构造函数创建一个浅表副本。 –

+0

没有@JBNizet。内部的HashMap维持其中包含键和值对象的数据表。数据表不浅复制。 –

+1

“从另一个地图初始化一个HashMap不会导致浅copy“。绝对错误,不要在这里引入'HashMap'的内部结构(这不叫'datatable')。 – Kayaman