7

我正在阅读 Javadoc for LinkedHashMap,其中提到:

putAll 方法为指定映射中的每个映射生成一个条目访问,按照指定映射的条目集迭代器提供键值映射的顺序。

我的问题是,“每个映射一个条目访问”是什么意思。如果有人可以帮助提供一个例子来澄清这一点,我们将不胜感激。

4

3 回答 3

3

本段适用于使用特殊构造函数创建的映射,该构造函数根据最后访问顺序生成迭代顺序(相对于标准 LinkedHashMap 的插入顺序。

它只是说,如果一个键K在映射中并且您也调用putAll(someOtherMap)where someOtherMapcontains K,这将被视为一种访问K,它将被移动到映射的末尾(从迭代顺序的角度来看)。

换句话说,从访问的角度来看,putAll等价于for (Entry e : entries) map.put(e);(在伪代码中)。

人为的例子:

public static void main(String[] args) throws Exception {
    Map<String, String> m = new LinkedHashMap<> (16, 0.75f, true);

    m.put("a", "a");
    m.put("b", "b");
    System.out.println("m = " + m); // a, b
    m.put("a", "a");
    System.out.println("m = " + m); // b, a

    Map<String, String> m2 = new LinkedHashMap<>();
    m2.put("b", "b");

    m.putAll(m2);
    System.out.println("m = " + m); // a, b: putAll was considered as an access
                                    // and the order has changed
}
于 2013-01-28T17:10:30.647 回答
3

应该在上下文中查看 API 文档中的注释(“putAll 方法为指定映射中的每个映射生成一个条目访问,按照指定映射的条目集迭代器提供键值映射的顺序。”)。以下是包含上下文的完整 API 文档:

提供了一个特殊的构造函数来创建一个链接的哈希映射,其迭代顺序是其条目最后一次访问的顺序,从最近最少访问到最近访问(访问顺序)。这种映射非常适合构建 LRU 缓存。调用 put 或 get 方法会导致访问相应的条目(假设它在调用完成后存在)。putAll 方法为指定映射中的每个映射生成一个条目访问,按照指定映射的条目集迭代器提供键值映射的顺序。没有其他方法生成条目访问...

本节描述影响“最后访问”确定的“访问”的定义。在这种情况下,它继续描述在访问映射方面如何处理 put/get 和 putall。put(k,v) 和 get(k) 分别被视为一次访问。类似地,putAll() 被视为按条目集维护的顺序对所有映射的一次访问。您可以将其想象为,对于每个 putAll(),所有映射的访问计数器都将按条目集维护的顺序增加 1。

希望这是您正在寻找的。

于 2013-01-28T17:17:29.877 回答
1

LinkedHashMap保留将元素放入其中的顺序。putAll 方法用于将所有映射从指定映射复制到此映射。

将所有映射从指定映射复制到此映射(可选操作)。这个调用的效果等同于对指定映射中从键 k 到值 v 的每个映射调用一次 put(k, v) 在这个映射上的效果。如果在操作进行时修改了指定的映射,则此操作的行为是未定义的。

“每个映射一个条目访问”意味着 putall 调用的效果等同于在指定映射中从键 k 到值 v 的每个映射调用一次 put(k, v) 的效果。

于 2013-01-28T16:51:59.897 回答