8

私はJavaの世界にかなり慣れていません(C / C ++でプライマリを書いているので)。アプリでマップを使用しています。java.util.Map抽象的であるため、その実装をインスタンス化する必要があります。通常、私はHashMap次のように使用します。

Map<String, MyClass> x = new HashMap<>();

しかし、Javaドキュメントでは、、、などの他の多くの実装を見つけました。TreeMap盲目的にを使用し続けることができるかどうか、またはそれらの実装間に重要な違いがあるかどうかを知りたいです。LinkedHashMapHashTableHashMapMap

知っておくべきポイントの簡単なリストは大丈夫です。ありがとう。

4

5 に答える 5

12
  • 気にしないでくださいHashtable。これはJava1.0の遺物です。
  • HashMapこれは、O(1)ルックアップととのみへの依存による普遍的なデフォルトでequalsありhashCode、すべてのJavaオブジェクトに実装されることが保証されています。
  • TreeMapマップエントリに対してソートされた反復を提供します(さらに多くの-を参照NavigableMap)が、比較戦略が必要であり、挿入とルックアップが遅くなります– O(logN)– HashMap;
  • LinkedHashMapエントリを反復処理するときに、挿入/アクセスの順序を保持します。

SortedMap実装は、などのいくつかの優れた機能を提供しheadMapますtailMapNavigableMap実装は、ソートされたキーを想定する操作に対して、優れたパフォーマンスを備えたさらに多くの機能を提供します。

さらにjava.util.concurrent、のようなマップ実装がありConcurrentHashMap、優れた同時パフォーマンスとアトミックなget/put操作を提供します。

于 2012-12-20T14:21:00.087 に答える
2
  • HashMapほとんどいつもそれを使用してください。equalsオブジェクトには、hashCodeメソッドの適切な実装が必要であることに注意してください。挿入順序は保存されません。
  • HashTable絶対に使用しないでください。
  • LinkedHashMapと同じHashMapですが、挿入順序を保存します。大きなオーバーヘッド。
  • TreeMap自然順をサポートします。ただし、挿入はO(logn)で機能します。
于 2012-12-20T14:24:22.510 に答える
2

私は主に使用するHashMapConcurrentHashMap、スレッドセーフにする必要がある場合

于 2012-12-20T14:24:43.173 に答える
1

もちろん、これらの各マップには重要な違いがあります。それは純粋にあなたがやろうとしていることに依存します。HashMapハッシュ関数が不十分な場合、aがかなり役に立たなくなる(非効率を参照)ことを思い出してください。は二重にリンクされLinkedHashMapHashMapリストに裏打ちされているため、繰り返し処理できます。もちろん、リンクリストに関連するオーバーヘッドを食べるでしょう。 TreeMap 要素を整理しておくので、その頭上を食べることになります。 HashTableは同期されたコレクションであり、通常は回避されます。

于 2012-12-20T14:22:42.250 に答える
0

これらのマップ実装間の重要な違いは何ですか

はい、の実装を選択する際に考慮すべきいくつかの大きな違いがありMapます。

Mapこれは、Java11にバンドルされている10個の実装のそれぞれの機能を比較して作成したグラフィックテーブルです。

Java11にバンドルされている<code>Map</code>の10の実装の機能を比較した表。

于 2019-12-28T23:18:18.120 に答える