Die*_*ego 35 java hashmap pass-by-reference
如果我创建一个新的HashMap和一个新的List,然后用一些任意键将List放在Hashmap中,然后调用List.clear()它会影响我在HashMap中放置的内容吗?
这里更深层次的问题是:当我向HashMap添加内容时,是复制并放置了一个新对象还是对放置的原始对象的引用?
谢谢!
Sco*_*eld 46
这里发生的是你在散列图中放置一个指向列表的指针,而不是列表本身.
当你定义
List<SomeType> list;
Run Code Online (Sandbox Code Playgroud)
您正在定义指向列表的指针,而不是列表本身.
当你这样做
map.put(somekey, list);
Run Code Online (Sandbox Code Playgroud)
你只是存储指针的副本,而不是列表.
如果,在其他地方,您遵循该指针并在其末尾修改对象,那么持有该指针的任何人仍将引用相同的修改对象.
有关Java中的pass-by-value的详细信息,请参阅http://javadude.com/articles/passbyvalue.htm.
Jam*_*eld 12
Java是按值传递的.
将列表添加到哈希映射只是添加对哈希映射的引用,该哈希映射指向相同的列表.因此,直接清除列表确实会清除您在散列映射中引用的列表.
当我向HashMap中添加某些内容时,是复制并放置了新对象还是放置了对原始对象的引用?
它始终是对对象的引用。如果清除HashMap,则该对象仍将处于“活动”状态。如果没有人再引用该对象,则该对象将被垃圾收集器销毁。如果需要复制它,请查看Object.clone()方法和Cloneable接口
Map<Integer, Integer> hasmapA = new HashMap<>();
hasmapA.put("key1", "value1");
hasmapA.put("key2", "value2");
hasmapA.put("key3", "value3");
Run Code Online (Sandbox Code Playgroud)
通过引用复制:如果将一个HashMap分配给另一个,则两者都指向内存中的同一引用。
地图有mapB;
哈希图B = 哈希图A;
如果您对其中任何一个进行更改,更改将反映在两个HashMap中,因为两者都引用相同的位置。
克隆/深复制/创建单独的内存位置/创建单独的对象
hashmapB 的同时复制 hashmapA 的内容
Map<Integer, Integer> hashmapB = new HashMap<>();;
hashmapB.putAll(hashmapA)
Run Code Online (Sandbox Code Playgroud)
注意: ** 您是否注意到 hashmapB 声明的两点差异?第二点我们必须调用 **HashMap构造函数。这样我们就可以把hashmapA的所有数据放入hashmapB中。
| 归档时间: |
|
| 查看次数: |
53824 次 |
| 最近记录: |