2011-11-02 16 views
57

HashMapを常に使用することができないのは、ArrayListまたはLinkedListよりもaddの方が効率が良いにもかかわらず、要素。LinkedListまたはArrayListにHashMapを使用する場合、またはその逆の場合

私はそれを見つけ出し、いくつかの理由を見つけましたが、HashMapを使用するための回避策はまだありましたが、利点はまだ生きています。

+11

は 'Lists'と' Maps'は異なる操作や不変条件を持つ2つの*全く*異なるデータ構造は、あります。あなたが考えている文脈/要件について、どちらが受け入れられる解決策であるのかを説明できますか? –

+3

明らかにあなたは*特定の順序で*のセットを保持する必要はありませんでした* ... –

+39

Downvote、なぜですか?私はこれが正しい質問だと思う。しかし、知識の不足を示していますが、SOの質問は知識の欠如を示すために下落してはいけません。実際、質問は常に知識の欠如の結果です。 –

答えて

78

リストは要素の順番付けを表します。 マップは、キーと値のペアの集合を表すために使用されます。

マップをリストとして使用することもできますが、リストを作成する際には明確な欠点があります。

保守指図: - 定義によるリストが注文されます。アイテムを追加すると、アイテムを挿入した順序でリストを反復することができます。 HashMapにアイテムを追加すると、アイテムを同じ順序で取得することが保証されません。順序を維持するLinkedHashMapのようなHashMapのサブクラスがありますが、一般的な順序はMapで保証されません。

キー/値の意味: - マップの目的は、後の時点でアイテムを取得するために使用することができ、キーに基づいてアイテムを格納することです。同様の機能は、キーがリスト内の位置にあるような限られた場合にのみ、リストを用いて達成することができる。

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

// 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 

コレクション機能 いくつかの偉大なユーティリティ関数は、コレクションクラスを使ってリストのために利用可能です。たとえば...このことができます

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

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

希望、

+0

リンクされたリストは、パフォーマンスの問題のために悪いと言われることがよくあります。要素の順序付けのために、私はArrayListsに対してLinkedListsを頻繁に使用します。ポジションをキーとしてHashMapsを使用した方がパフォーマンスとメモリが向上しますか? – Seza

28

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

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

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

関連する問題