LinkedListまたはArrayListでHashMapを使用する場合、またはその逆の場合


82

要素の数に関係なく、add、remove操作でArrayListやLinkedListよりもはるかに効率的であるにもかかわらず、HashMapを常に使用できるとは限らない理由は何ですか。

私はそれをグーグルで検索し、いくつかの理由を見つけましたが、HashMapを使用するための回避策は常にあり、利点はまだ残っています。


11
ListsMapsは2つの完全に異なるデータ構造であり、操作と不変条件が異なります。どちらも許容できるソリューションになると考えているコンテキスト/要件を説明できますか?
マークピーターズ

3
どうやらあなたは、物事のセットを維持するために必要なことがありません特定の順序で...
ブライアン・ローチ

52
反対票、なぜですか?これは適切な質問だと思います。知識の欠如を示していますが、SOの質問では、知識の欠如を示すために反対票を投じるべきではありません。実際、質問は常に知識の欠如の結果です。

回答:


96

リストは、要素の順序を表します。マップは、キーと値のペアのコレクションを表すために使用されます。

マップをリストとして使用することもできますが、そうすることには明確な欠点がいくつかあります。

順序の維持: -定義によるリストが順序付けられます。アイテムを追加すると、アイテムを挿入した順序でリストを繰り返すことができます。アイテムをHashMapに追加する場合、アイテムを配置したのと同じ順序でアイテムを取得することは保証されません。LinkedHashMapのようなHashMapのサブクラスがあり、順序を維持しますが、通常、マップでは順序が保証されません。

キー/値のセマンティクス: -マップの目的は、後でアイテムを取得するために使用できるキーに基づいてアイテムを格納することです。同様の機能は、キーがリスト内の位置にあるという限られた場合にのみ、リストを使用して実現できます。

コードの可読性 次の例を検討してください。

    // Adding to a List
    list.add(myObject);         // adds to the end of the list
    map.put(myKey, myObject);   // sure, you can do this, but what is myKey?
    map.put("1", myObject);     // you could use the position as a key but why?

    // Iterating through the items
    for (Object o : myList)           // nice and easy
    for (Object o : myMap.values())   // more code and the order is not guaranteed

コレクション機能 いくつかの優れたユーティリティ関数は、Collectionsクラスを介してリストで使用できます。例えば ​​...

    // Randomize the list
    Collections.shuffle(myList);

    // Sort the list
    Collections.sort(myList, myComparator);  

お役に立てれば、


LinkedListsは、パフォーマンスの問題のために悪いとよく言われます。要素の順序が原因で、ArrayListsよりもLinkedListsを頻繁に使用します。位置をキーとしてHashMapを使用した方が(パフォーマンスとメモリの点で)優れているでしょうか?
Cesar Castro

33

リストとマップは異なるデータ構造です。マップは、キーを値に関連付けたい場合に使用され、リストは順序付けられたコレクションです。

MapはJavaCollection Frameworkのインターフェースであり、HashMapはMapインターフェースの1つの実装です。HashMapは、キーに基づいて値を検索し、キーに基づいて値を挿入および削除するのに効率的です。HashMapのエントリは順序付けられていません。

ArrayListとLinkedListは、Listインターフェイスの実装です。LinkedListは順次アクセスを提供し、通常、リスト内の要素の挿入と削除の効率は高くなりますが、リスト内の要素へのアクセスの効率は低下します。ArrayListはランダムアクセスを提供し、要素へのアクセスはより効率的ですが、一般的に要素の挿入と削除は遅くなります。


1

ここでは、実際の事例とシナリオをいくつか紹介します。どちらを使用するかは、他の誰かの助けになるかもしれません。

HashMap

アプリケーションでキャッシュを使用する必要がある場合。Redisとmembaseは、拡張HashMapの一種です。(要素の順序は関係ありません。キーを使用して、すばやく(O(1))読み取りアクセス(値)が必要です)。

LinkedList

順序が重要な場合(LinkedListに追加されたときに順序付けられます)、要素の数は不明であり(メモリ割り当てを無駄にしないでください)、迅速な挿入時間が必要です(O(1))。追加されたときに順番にリストできるToDoアイテムのリストは良い例です。


0

ArrayListとLinkedListの欠点は、検索アルゴリズムによっては、それらを反復処理するときに、リストのサイズに応じてアイテムを見つけるのにかかる時間が長くなることです。

ハッシュの利点は、要素の検索に余分な時間を犠牲にしても、マップのサイズに応じて時間がかからないことです。これは、HashMapが検索している要素を直接インデックスに変換することで情報を見つけるため、ジャンプできるためです。

簡単に言うと... LinkedList:ArrayListよりも少し多くのメモリを消費し、挿入(追加と削除)のコストが低い ArrayList:少ないメモリを消費しますが、LinkedListと同様であり、大きい場合は検索に余分な時間がかかります。 HashMap:値へのジャンプを実行して、大きなマップの検索時間を一定にすることができます。小さなリストよりも多くのメモリを消費し、値を見つけるのに時間がかかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.