HashMap内存分配不明确

时间:2014-01-19 13:19:45

标签: java android hashmap

根据android's developers site,它似乎是方法

public V put (K key, V value)

将使用给定的值对象作为参考,而方法

public void putAll (Map<? extends K, ? extends V> map)

将每个提供的地图元素复制到新的值对象 android源代码不会揭示每种方法的内部结构。

我的理解是否正确?

4 个答案:

答案 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方式。