7

私は Javadoc for を読んLinkedHashMapでいます。

putAll メソッドは、指定されたマップのエントリ セット イテレータによってキーと値のマッピングが提供される順序で、指定されたマップ内のマッピングごとに 1 つのエントリ アクセスを生成します。

私の質問は、「マッピングごとに 1 つのエントリ アクセス」とはどういう意味ですか。これを明確にするための例を提供してくれる人がいれば幸いです。

4

3 に答える 3

3

この段落は、最後のアクセス順序に基づいて反復順序を作成する特別なコンストラクターで作成されたマップに適用されます(標準の LinkedHashMap.

キーがマップ内にあり、 where containsもK呼び出す場合、これはアクセスと見なされ、マップの最後に移動されます (反復順序の観点から)。putAll(someOtherMap)someOtherMapKK

つまり、アクセスの観点からは、 (疑似コードで)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 メソッドは、指定されたマップの各マッピングに対して、指定されたマップのエントリ セット イテレータによってキーと値のマッピングが提供される順序で、1 つのエントリ アクセスを生成します。」) は、コンテキストで表示する必要があります。コンテキストを含む完全な API ドキュメントは次のとおりです。

リンクされたハッシュ マップを作成するために、特別なコンストラクターが提供されます。この反復順序は、そのエントリが最後にアクセスされた順序であり、最も最近アクセスされたものから最も最近アクセスされたもの (アクセス順) です。この種のマップは、LRU キャッシュの構築に適しています。put メソッドまたは get メソッドを呼び出すと、対応するエントリにアクセスできます (呼び出しの完了後にエントリが存在すると仮定します)。putAll メソッドは、指定されたマップのエントリ セット イテレータによってキーと値のマッピングが提供される順序で、指定されたマップ内のマッピングごとに 1 つのエントリ アクセスを生成します。エントリアクセスを生成する他のメソッドはありません...

このセクションでは、「最後にアクセスした」の決定に影響を与える「アクセス」を定義するものについて説明します。そのコンテキストでは、マッピングのアクセスに関して put/get および putall がどのように扱われるかについて説明します。put(k,v) と get(k) は、それぞれアクセスとして扱われます。同様に、putAll() は、エントリ セットによって維持される順序で、すべてのマッピングに対する 1 つのアクセスとして扱われます。これは、putAll() ごとに、すべてのマッピングのアクセス カウンターが、エントリ セットによって維持される順序で 1 ずつ増加することを想像できます。

これがあなたが探しているものであることを願っています。

于 2013-01-28T17:17:29.877 に答える
1

LinkedHashMap要素を入れた順序を保持します。putAll メソッドは、指定されたマップからこのマップにすべてのマッピングをコピーするために使用されます。

指定されたマップからこのマップにすべてのマッピングをコピーします (オプションの操作)。この呼び出しの効果は、指定されたマップのキー k から値 v へのマッピングごとに、このマップで put(k, v) を 1 回呼び出すのと同じです。操作の進行中に指定されたマップが変更された場合、この操作の動作は未定義です。

「マッピングごとに 1 つのエントリ アクセス」とは、putall 呼び出しの効果が、指定されたマップ内のキー k から値 v へのマッピングごとに、このマップ上で put(k, v) を 1 回呼び出した場合と同等であることを意味します。

于 2013-01-28T16:51:59.897 に答える