考虑一下,我有一个驱动程序函数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,因此foo()中的map操作将在与最初版本的map不同的版本上操作。我相信的理由:
引用数据类型参数(如对象)也按值传递给方法。这意味着当方法返回时,传入的引用仍然引用相同的对象。但是,如果对象的字段具有适当的访问级别,则可以在方法中更改它们的值。
因此,由于我们正在创建一个浅拷贝,对副本的操作将最终更改已传递的映射,并且由于第2点的原因,对此传递映射的所有更改都会反映在原始映射上。
但我有一个自相矛盾的例子质疑我的理解。那么,我的想法正确吗?还是有别的东西?
发布于 2017-10-17 16:58:34
从另一个映射初始化hashmap不会导致浅拷贝。新的map对象将有它自己的数据,因此删除或添加条目不会影响这两个映射。但是,两个映射中的键和值对象都是相同的,因此,对键和值对象的任何操作都是可见的,前提是这些对象不是不可变的,也不是字符串对象。
https://stackoverflow.com/questions/46795260
复制相似问题