2009-09-14 17 views
19

ハッシュテーブルがあります。 values()メソッドは、私が挿入されている順序とは異なる順序で値を返します。挿入したのと同じ順序で値を取得できますか?LinkedHashmapの使用は代替ですが、同期されません。ハッシュテーブルの要素の順序を保持する方法

+0

、使用している言語を使用したい場合は、

Map m = Collections.synchronizedMap(new LinkedHashMap(...)); 

を使うのか? –

+0

LinkedHashMapはJavaの一部です。 – jimyi

+0

私はJavaを使用しています。 JDK1.6 –

答えて

31

LinkedHashMapを使用してください。 Mapインターフェース、 の

ハッシュテーブルとリンクされたリスト 実装予測可能な繰り返し順序を持ちます。この 実装は、 がすべてのエントリで実行されていることを維持していることを のHashMapとは異なります。 このリンクリストでは、 の順序付けが定義されています。通常は のキーで、 のマップ(、挿入順)にキーが挿入されています。 キーがの場合は、 の挿入順序に影響はありません。を地図に再挿入してください。 ( m.containsKey(k)true 直前呼び出しに戻ってくるときに m.put(k, v)が呼び出された場合 キーkがマップMに再挿入される。)

Collections.synchronizedMap()と組み合わせます。

ので、例えば:

Map<String, String> map = Collections.synchronizedMap(
    new LinkedHashMap<String, String>()); 
+0

明確にする:一度に1つ以上のトレッドがこの 'LinkedHashMap'にアクセスするのを見ていないのであれば、それをまだ同期することをお勧めしますか?または、それ自身の 'LinkedHashMap'は十分だと考えられますか? – blo0p3r

+1

@ blo0p3r 'LinedHashMap'はそれだけで十分です。 –

1

ハッシュテーブルは本質的に順序付けられていないので、間違ったデータ構造を使用しています。あなたが使用している言語を指定していないので、代替を提案することはできませんが、順序付けられたキー/値セットが必要です。

+0

私はJavaを使用しています。 JDK1.6 –

2

私はハッシュテーブルが並べ替えられていない理由は、保存と検索速度を助けることであることを確信しています。このため、順序を維持し、値を格納するためにハッシュテーブルを使用するだけで(高速検索用に)外部構造を使用することをお勧めします。

4

あなたはLinkedHashMapをラップして同期するか、同期LinkedHashMapを作成するためにCollections.synchronizedMapユーティリティを使用することができます可能性があり、次のいずれか

Map m = Collections.synchronizedMap(new LinkedHashMap(...)); 

のJavaDocから:

複数のスレッドがリンクハッシュマップにアクセスした場合同時に少なくとも1つのスレッドがマップを構造的に変更する場合は、外部と同期させる必要があります。これは、通常、マップを自然にカプセル化するオブジェクトで同期することによって実現されます。そのようなオブジェクトが存在しない場合は、Collections.synchronizedMapメソッドを使用してマップを「ラップする」必要があります。誤って非同期でマップにアクセスするのを防ぐために、作成時に行うのが最適です。

+0

ありがとう、それはパフォーマンスヒットでしょうか? –

+0

パフォーマンスのオーバーヘッドは無視できます(文字どおりナノ秒)。 – Adamski

1

jdk1.6には、2つの型の順序マップEnumMapとLinkedHashMapしかありません。両方とも同期していません。あなただけのオーダーを覚えておく必要がある場合は、ソートされ、その後ConcurrentSkipListMapの

関連する問題