根据android's developers site,它似乎是方法
public V put (K key, V value)
将使用给定的值对象作为参考,而方法
public void putAll (Map<? extends K, ? extends V> map)
将每个提供的地图元素复制到新的值对象 android源代码不会揭示每种方法的内部结构。
我的理解是否正确?
答案 0 :(得分:0)
在java中没有通过引用传递的东西:
http://javadude.com/articles/passbyvalue.htm
有关长篇讨论,请参阅此文章:Is Java "pass-by-reference" or "pass-by-value"?
当你调用put时,键和值被复制.putAll只是为了复制整个地图,它就像一个方便的功能,可以更容易地复制地图。
在调用put之后尝试编辑键和值的值时,您会看到它们在复制到的映射中没有更改,只在您更改它们的范围内。
基本上,传递给函数时会复制值。
答案 1 :(得分:0)
putAll
只需迭代源Map的入口集,并为每个k-v对调用put (K key, V value)
。没什么特别的。因此它的行为与在for循环中多次调用put
的行为相同。
阅读下面的代码然后你就会明白。
public void putAll(Map<? extends K, ? extends V> m) {
for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
put(e.getKey(), e.getValue());
}
由OP编辑完成答案:
此代码证明put(key,value)
不会创建新对象,但使用value参数,我只是测试它并在调试器中观察变量:
Map<String, Rect> mymap = new HashMap<String, Rect>();
Rect r1 = new Rect(0,120,200,155);
mymap.put("corner", r1);
r1.offset(20, 17);
Rect r2 = mymap.get("corner");
r1变为(20,137,220,172),返回值r2也是如此,证明参考被保留。
答案 2 :(得分:0)
将指定地图中的所有映射复制到“此”地图。这些映射将替换“此”映射对当前位于指定映射中的任何键的任何映射。 'this'是您调用此函数的地图对象。
答案 3 :(得分:0)
不,这是不正确的。 putAll
也只会复制引用。
甚至没有明确定义的替代方案,正如我们在C ++等其他语言中所做的那样,其中复制和赋值运算符的定义非常明确。这可能就是为什么文档的措辞在这方面似乎有点不清楚了:它的措辞非常简单,采用了典型的Java方式。