web-dev-qa-db-ja.com

LinkedHashMapのentrySet()も順序を保証しますか?

だれかがアクセスしようとしたときに順序を保証するために、linkedHashMapを使用しています。しかし、それを反復するときが来たら、entrySet()を使用してキー/値のペアを返すと順序も保証されますか?反復中に変更は行われません。

編集:また、キーを反復してgetを呼び出すことにより、マップを反復することによる悪影響はありますか?

66
Diego

Javadocs によると、はい。

この実装は、そのすべてのエントリを介して実行される二重リンクリストを維持するという点でHashMapと異なります。このリンクリストは反復順序を定義します。これは通常、キーがマップに挿入された順序です(insertion-order)。

編集に関しては、いや、それはうまくいくはずです。しかし、エントリセットは、反復中にマップ内のすべてのキーを検索するオーバーヘッドを回避するため、いくぶん高速です。

49
Michael Myers

このリンクリストは反復順序を定義します。これは通常、キーがマップに挿入された順序(挿入順序)です。キーがマップに再挿入される場合、挿入順序は影響を受けないことに注意してください。 (m.containsKey(k)が呼び出しの直前にtrueを返すときにm.put(k、v)が呼び出されると、キーkはマップmに再挿入されます。)

1
Robert

反復中に変更が行われないことが確実な場合、 [〜#〜] api [〜#〜] で述べられているように、entrySet()での適切な順序付けが保証されます。

1