的考虑,我有被定义的驱动程序功能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
,因此操作在map
内foo()
将是对不同版本的map
比原来的一个。 原因我的信念:
- 据this后,我们可以说,我们正在做的哈希表的shallow copy。
- 在this文档,其中可以清楚地表示:
参考数据类型参数,如对象,也传递到 方法由值。这意味着当方法返回时, 传入引用仍然引用与之前相同的对象。 但是,如果对象的字段的值具有适当的访问级别,则可以在 方法中更改对象字段的值。
因此,因为我们是在做一个浅拷贝,在复制操作将最终改变传递的地图,所有的变化在此通过地图将反映在原始地图,因为2点
但我有一个矛盾的例子,质疑我的理解。那么,我的想法是否正确?或者还有别的东西呢?
我真的不跟着你不是String对象。复制意味着与英文相同的东西。如果您制作文档的副本并修改副本,则原始文档保持不变。这是副本的重点。所以不,对map2的更改不会使任何变换映射。顺便说一下,你可以轻松地进行实验和测试。 –
浅层或深层复制在这里并不重要:地图只包含不可变的值。 –
定义你所说的“改变传递图”。如果你的意思是它的设定键/值,那么他们不会为'map2'当您添加或删除'map'到/一键改变的意思。如果你指的是实际当你改变它们的状态(例如通过set方法)时,键或值对象的状态,那么它们将会反映在两个地图中,因为这两个地图都会引用相同的键/值对象 – tsolakp