浅层复制的范围

时间:2017-10-17 16:50:04

标签: java hashmap parameter-passing shallow-copy

考虑一下,我有一个驱动程序函数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比原来的MonitoredSession。 我相信的理由:

  1. 根据this帖子,我们可以说我们正在制作哈希地图的shallow copy
  2. this文档中,明确说明:
  3.   

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

    因此,由于我们正在制作浅色副本,因此对副本的操作最终会更改传递的地图,并且由于第2点,此传递的地图上的所有更改都会反映在原始地图上。

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

1 个答案:

答案 0 :(得分:-2)

从另一个地图初始化散列图不会导致浅拷贝。新的地图对象将拥有自己的数据表,因此删除或添加条目不会影响这两个地图。但是,两个映射中的键和值对象都是相同的,因此对键和值对象的任何操作都将在两者中都可见,前提是这些对象不是不可变的而不是字符串对象