web-dev-qa-db-ja.com

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

エレメントの数に関係なく、add、remove操作でArrayListまたはLinkedListよりもはるかに効率的であるにもかかわらず、常にHashMapを使用できない理由は何ですか。

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

69
user517491

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

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

維持順序:-定義によるリストが順序付けられます。アイテムを追加すると、アイテムを挿入した順序でリストを繰り返し処理できます。 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);  

お役に立てれば、

90
polster

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

Mapは、Java Collection Frameworkのインターフェースです。HashMapはMapインターフェースの実装の1つです。 HashMapのエントリは順序付けられていません。

ArrayListとLinkedListは、Listインターフェイスの実装です。 LinkedListはシーケンシャルアクセスを提供し、一般的にリスト内の要素の挿入と削除はより効率的ですが、リスト内の要素へのアクセスは効率的ではありません。 ArrayListはランダムアクセスを提供し、要素へのアクセスはより効率的ですが、一般的に要素の挿入と削除は遅くなります。

31
jazzdawg