web-dev-qa-db-ja.com

HashMap、LinkedHashMap、TreeMapの違い

JavaにおけるHashMapLinkedHashMap、およびTreeMapの違いは何ですか? 3つすべてにkeySetvaluesがあるので、出力に違いはありません。 Hashtablesとは何ですか?

Map m1 = new HashMap();
m1.put("map", "HashMap");
m1.put("schildt", "Java2");
m1.put("mathew", "Hyden");
m1.put("schildt", "Java2s");
print(m1.keySet()); 
print(m1.values()); 

SortedMap sm = new TreeMap();
sm.put("map", "TreeMap");
sm.put("schildt", "Java2");
sm.put("mathew", "Hyden");
sm.put("schildt", "Java2s");
print(sm.keySet()); 
print(sm.values());

LinkedHashMap lm = new LinkedHashMap();
lm.put("map", "LinkedHashMap");
lm.put("schildt", "Java2");
lm.put("mathew", "Hyden");
lm.put("schildt", "Java2s");
print(lm.keySet()); 
print(lm.values());
890
Kevin

3つのクラスすべてがMapインターフェースを実装し、ほとんど同じ機能を提供します。最も重要な違いは、エントリを反復処理する順序です。

  • HashMapは、繰り返しの順序について絶対に保証しません。新しい要素が追加されると、完全に変更される可能性があります(そして変更される予定もあります)。
  • TreeMapは、それらのcompareTo()メソッド(または外部から提供されたComparator)に従って、キーの "自然な順序"に従って繰り返します。さらに、このソート順に依存するメソッドを含む SortedMap インターフェースを実装しています。
  • LinkedHashMapはエントリーがマップに入れられた順番で繰り返します

"Hashtable" はハッシュベースのマップの総称です。 Java APIのコンテキストでは、Hashtableは、コレクションフレームワークが存在する前のJava 1.1の時代からの時代遅れのクラスです。そのAPIは機能を複製する廃止されたメソッドで雑然としていて、そのメソッドは同期されているので(これはもう使用すべきではありません)(これはパフォーマンスを低下させる可能性があり、一般に無用です)。 Hashtableの代わりに ConcurrentHashMap を使用します。

1096

私は視覚的な表現を好みます:

╔══════════════╦═════════════════════╦═══════════════════╦═════════════════════╗
║   Property   ║       HashMap       ║      TreeMap      ║     LinkedHashMap   ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ Iteration    ║  no guarantee order ║ sorted according  ║                     ║
║   Order      ║ will remain constant║ to the natural    ║    insertion-order  ║
║              ║      over time      ║    ordering       ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║  Get/put     ║                     ║                   ║                     ║
║   remove     ║         O(1)        ║      O(log(n))    ║         O(1)        ║
║ containsKey  ║                     ║                   ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║                     ║   NavigableMap    ║                     ║
║  Interfaces  ║         Map         ║       Map         ║         Map         ║
║              ║                     ║    SortedMap      ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║                     ║                   ║                     ║
║     Null     ║       allowed       ║    only values    ║       allowed       ║
║ values/keys  ║                     ║                   ║                     ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║              ║   Fail-fast behavior of an iterator cannot be guaranteed      ║
║   Fail-fast  ║ impossible to make any hard guarantees in the presence of     ║
║   behavior   ║           unsynchronized concurrent modification              ║
╠══════════════╬═════════════════════╦═══════════════════╦═════════════════════╣
║              ║                     ║                   ║                     ║
║Implementation║      buckets        ║   Red-Black Tree  ║    double-linked    ║
║              ║                     ║                   ║       buckets       ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║      Is      ║                                                               ║
║ synchronized ║              implementation is not synchronized               ║
╚══════════════╩═══════════════════════════════════════════════════════════════╝
1506
Sergii Shevchyk

3つすべてが一意のキーから値へのマッピングを表しているため、 Map インターフェイスを実装しています。

  1. HashMapは ハッシュ のキーに基づくマップです。 O(1) get/put操作をサポートしています。これが機能するには、キーは hashCode()equals() の一貫した実装を持たなければなりません。

  2. LinkedHashMapはHashMapと非常によく似ていますが、アイテムが追加(またはアクセス)される順序に意識を追加するため、繰り返し順序は挿入順序(または構築パラメーターによってはアクセス順序)と同じです。

  3. TreeMapはツリーベースのマッピングです。そのput/get操作にはO(log n)時間がかかります。アイテムには、ComparableまたはComparatorのいずれかを使用した比較メカニズムが必要です。繰り返しの順序はこのメカニズムによって決まります。

62
Eyal Schneider

次の図で、各クラスがクラス階層のどこにあるかを確認してください( 大きい方 )。 TreeMapはSortedMapNavigableMapを実装しますが、HashMapは実装しません。

HashTableは廃止されており、対応するConcurrentHashMapクラスを使用する必要があります。 enter image description here

43
pierrotlefou

ハッシュマップ

  • ペアの値(キー、値)があります
  • 重複キー値なし
  • 順不同
  • 1つのnullキーと複数のnull値を使用できます

ハッシュ表

  • ハッシュマップと同じ
  • nullキーとnull値は許可されません

LinkedHashMap

  • マップ実装の注文版です
  • リンクリストとハッシュデータ構造に基づく

ツリーマップ

  • 注文および分類されたバージョン
  • ハッシュデータ構造に基づく
37
Prem Kumar

私がそれぞれの地図をいつ使うかについての、私自身の地図の経験からのちょっとしたインプット。

  • HashMap - 最高のパフォーマンス(高速)の実装を探すときに最も便利です。
  • TreeMap(SortedMap interface) - 私が定義した特定の順序でキーをソートまたは反復できるかどうかに関心がある場合に最も役立ちます。
  • LinkedHashMap - TreeMapの保守コストを増やすことなく、TreeMapからの順序保証付きの利点を組み合わせます。 (HashMapとほぼ同じ速さです)。特に、LinkedHashMapは、 removeEldestEntry() メソッドをオーバーライドしてCacheオブジェクトを作成するための優れた出発点にもなります。これにより、定義したいくつかの基準を使用してデータを期限切れにすることができるCacheオブジェクトを作成できます。
35
Ogre Psalm33

3つのクラスHashMapTreeMapおよびLinkedHashMapはすべてJava.util.Mapインターフェースを実装し、固有キーから値へのマッピングを表します。

HashMap

  1. HashMapはキーに基づく値を含みます。

  2. それは唯一の要素を含みます。

  3. 1つのnullキーと複数のnull値があります。

  4. 順序なしを維持します。

    public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

LinkedHashMap

  1. LinkedHashMapはキーに基づく値を含みます。
  2. それは唯一の要素を含みます。
  3. 1つのnullキーと複数のnull値があります。
  4. HashMapが代わりに挿入順序を維持するのと同じです。 //下記のクラスの減速度を参照

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

TreeMap

  1. TreeMapはキーに基づく値を含みます。 NavigableMapインターフェースを実装し、AbstractMapクラスを拡張します。
  2. それは唯一の要素を含みます。
  3. Nullキーを持つことはできませんが、複数のnull値を持つことができます。
  4. HashMapが代わりに昇順を維持するのと同じです(キーの自然な順序でソートされます)。

    public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable

ハッシュテーブル

  1. Hashtableはリストの配列です。各リストはバケットと呼ばれます。バケットの位置はhashcode()メソッドを呼び出すことによって識別されます。 Hashtableはキーに基づく値を含みます。
  2. それは唯一の要素を含みます。
  3. Nullキーまたは値がない可能性があります。
  4. synchronizedです。
  5. それはレガシークラスです。

    public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable

参照: http://javarevisited.blogspot.in/2015/08/difference-between-HashMap-vs-TreeMap-vs-LinkedHashMap-Java.html

17
roottraveller

HashMapは繰り返しの順序については絶対に保証しません。新しい要素が追加されると、完全に変更される可能性があります(そして変更される予定もあります)。 TreeMapは、compareTo()メソッド(または外部から提供されたComparator)に従って、キーの「自然順序付け」に従って反復します。さらに、このソート順に依存するメソッドを含むSortedMapインターフェースを実装しています。 LinkedHashMapはエントリがマップに入れられた順番で繰り返します。

パフォーマンスの変化を見てください。 enter image description here

ソートマップの実装であるツリーマップ。 Naturalの順序付けのため、put、get、およびcontainsKey操作の複雑さはO(log n)です。

@Amit:SortedMapはインターフェースですが、TreeMapSortedMapインターフェースを実装するクラスです。それはもしSortedMapがその実装者にするように頼むプロトコルに従うならば意味します。木は検索木として実装されない限り、木はどんな種類の木でもあり得るのであなたに順序付けされたデータを与えることができません。そのため、TreeMapをソート順のように機能させるために、SortedMapを実装しています(Binary Search Tree - BST、AVLやR-B TreeのようなBST、さらにはTernary Search Treeなど)。

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements SortedMap<K,V>, Cloneable, Serializable

NUT-Shellの場合HashMap:O(1)のデータを並べ替えません。

TreeMap:O(log N)、2を基数とするデータを順序付けされたキーとともに与える

LinkedHashMap:ツリーに挿入される方法でデータを格納するためのリンクリスト(indexed-SkipListと考えてください)機能を持つハッシュテーブルです。 LRUの実装に最も適しています(最低使用頻度)。

9
siddhusingh

以下はHashMapとTreeMapの主な違いです

  1. HashMapは順序を維持しません。つまり、HashMapは、最初に挿入された要素が最初に印刷されるという保証はありません。TreeSetと同様に、TreeMap要素も要素の自然順序付けに従って並べ替えられます。

  2. 内部HashMap実装はHashingを使用し、TreeMapは内部的に赤黒ツリー実装を使用します。

  3. HashMapは1つのnullキーと多くのnull値を格納できます。TreeMapにはnullキーを含めることはできませんが、多くのnull値を含めることができます。

  4. HashMapは、getやputなどの基本操作、つまりO(1)に対して一定の時間パフォーマンスを発揮します。Oracleのドキュメントによると、TreeMapはgetおよびputメソッドに対してlog(n)の時間コストを保証します。

  5. HashMapのパフォーマンス時間は、ほとんどの操作でログ時間TreeMapに対して一定であるため、HashMapはTreeMapよりはるかに高速です。

  6. HashMapは比較にequals()メソッドを使用し、TreeMapは順序を維持するためにcompareTo()メソッドを使用します。

  7. HashMapはMapインターフェースを実装し、TreeMapはNavigableMapインターフェースを実装します。

6
Vijay Barot

これらは同じインターフェースの異なる実装です。各実装には、長所と短所(高速挿入、低速検索)、またはその逆があります。

詳細については、 TreeMapHashMapLinkedHashMap のjavadocを参照してください。

5
tangens
  • ハッシュマップ:

    • 注文が維持されない
    • LinkedHashMapより速い
    • オブジェクトのストアヒープに使用されます
  • LinkedHashMap:

    • LinkedHashMapの挿入順序は維持されます
    • HashMapより遅く、TreeMapより速い
    • 広告掲載オーダーを維持したい場合はこれを使用してください。
  • TreeMap:

    • TreeMapはツリーベースのマッピングです
    • TreeMapはキーの自然な順序に従います
    • HashMapとLinkedHashMapより遅い
    • 自然な(デフォルトの)順序を維持する必要があるときにTreeMapを使用
4
Premraj

ハッシュマップは挿入順序を保存しません。
例ハッシュマップ

1  3
5  9
4   6
7   15
3   10

それを保存することができます

4  6
5  9
3  10
1  3
7  15

リンクハッシュマップは挿入順序を保持します。

例です。
キーを挿入している場合

1  3
5  9
4   6
7   15
3   10

それはとして保存されます

1  3
5  9
4   6
7   15
3   10

挿入するのと同じです。

ツリーマップは値をキーの昇順に格納します。例です。
キーを挿入している場合

1  3
5  9
4   6
7   15
3   10

それはとして保存されます

1  3
3  10
4   6
5   9
7   15
3
Shivam Shukla

すべてがキー - >値マップとキーを反復処理する方法を提供します。これらのクラス間の最も重要な違いは、時間保証とキーの順序です。

  1. HashMapは0(1)検索と挿入を提供します。ただし、キーを反復処理する場合、キーの順序は基本的に任意です。リンクリストの配列で実装されています。
  2. TreeMapはO(log N)の検索と挿入を提供します。キーは順序付けされているので、キーをソート順に繰り返す必要がある場合は、そうすることができます。つまり、キーはComparableインタフェースを実装する必要があります。TreeMapは赤黒木によって実装されます。
  3. LinkedHashMapは0(1)検索と挿入を提供します。キーは挿入順に並べられています。これは二重リンクバケットによって実装されています。

以下の関数に空のTreeMap、HashMap、およびLinkedHashMapを渡したとします。

void insertAndPrint(AbstractMap<Integer, String> map) {
  int[] array= {1, -1, 0};
  for (int x : array) {
    map.put(x, Integer.toString(x));
  }
  for (int k: map.keySet()) {
   System.out.print(k + ", ");
  }
}

それぞれの出力は以下の結果のようになります。

HashMapの場合、出力は私自身のテストでは{0、1、-1}でしたが、順序は任意です。注文に関する保証はありません。
ツリーマップ、出力は{-1、0、1}
LinkedList、出力は{1、-1、0}でした

1
Jitendra

ハッシュマップ
にはヌルキーを1つ含めることができます。

HashMapは順序を維持しません。

ツリーマップ

TreeMapにはnullキーを含めることはできません。

TreeMapは昇順を維持します。

LinkedHashMap

LinkedHashMapを使用して、Mapにキーが挿入される挿入順序を維持したり、キーがアクセスされるアクセス順序を維持したりすることができます。

::

1)HashMap map = new HashMap();

    map.put(null, "Kamran");
    map.put(2, "ALi");
    map.put(5, "From");
    map.put(4, "Dir");`enter code here`
    map.put(3, "Lower");
    for (Map.Entry m : map.entrySet()) {
        System.out.println(m.getKey() + "  " + m.getValue());
    } 

2)TreeMapマップ= new TreeMap();

    map.put(1, "Kamran");
    map.put(2, "ALi");
    map.put(5, "From");
    map.put(4, "Dir");
    map.put(3, "Lower");
    for (Map.Entry m : map.entrySet()) {
        System.out.println(m.getKey() + "  " + m.getValue());
    }

3)LinkedHashMap map = new LinkedHashMap();

    map.put(1, "Kamran");
    map.put(2, "ALi");
    map.put(5, "From");
    map.put(4, "Dir");
    map.put(3, "Lower");
    for (Map.Entry m : map.entrySet()) {
        System.out.println(m.getKey() + "  " + m.getValue());
    }
0
Kamran