web-dev-qa-db-ja.com

どのJavaコレクションを使用する必要がありますか?

この質問では C++ 11で標準ライブラリコンテナを効率的に選択するにはどうすればよいですか? は、C++コレクションを選択するときに使用する便利なフローチャートです。

これはどのコレクションを使用すべきかわからない人にとって有用なリソースだと思ったので、Javaの同様のフローチャートを見つけようとしましたが、できませんでした。

Javaでプログラミングするときに使用する適切なコレクションを選択するのに役立つリソースと「チートシート」は何ですか?使用するList、Set、Mapの実装をどのように知るのでしょうか?

118
Tim B

同様のフローチャートが見つからなかったため、自分で作成することにしました。

このフローチャートは、同期アクセス、スレッドセーフなど、またはレガシーコレクションのようなものをカバーしようとはしていませんが、3つの標準Sets、3 standardMapsと2つのstandardLists。

enter image description here

この画像はこの回答用に作成され、 Creative Commons Attribution 4.0 International License。 でライセンスされています。==最も簡単な属性は、この質問またはこの回答にリンクすることです。

その他のリソース

おそらく最も有用な他のリファレンスは、それぞれの Collection を説明するOracleドキュメントの次のページです。

HashSet vs TreeSet

HashSetまたはTreeSetをいつ使用するかの詳細な説明があります: Hashset vs Treeset

ArrayList vs LinkedList

詳細な説明: ArrayListではなくLinkedListを使用する場合

268
Tim B

主要な非並行、非同期のコレクションの概要

Collection :「要素」と呼ばれるアイテムの順序付けられていない「バッグ」を表すインターフェイス。 「次の」要素は未定義(ランダム)です。

  • Set :重複のないCollectionを表すインターフェイス。
    • HashSetSet によって裏付けられたHashtable。注文が重要でない場合の、最も高速で最小のメモリ使用量。
    • LinkedHashSet挿入順序で要素を関連付けるリンクリストを追加したHashSet。 「次の」要素は、最後から2番目に挿入された要素です。
    • TreeSetSetの要素は Comparator (通常 自然注文 )。最も低速で最大のメモリ使用量ですが、コンパレータベースの順序付けに必要です。
    • EnumSet :単一の列挙型用にカスタマイズされた非常に高速で効率的なSet
  • List :要素が順序付けられ、それぞれがその位置を表す数値インデックスを持つCollectionを表すインターフェイス。ゼロは最初の要素、(length - 1)は最後の要素です。
    • ArrayList :配列に裏打ちされたList。ここで、配列の長さ(「容量」と呼ばれる)は少なくとも要素の数と同じ大きさ(リストの「サイズ」)。サイズが容量を超えると((capacity + 1)-th要素が追加されると)、新しい容量(new length * 1.5)で配列が再作成されます System.arrayCopy()を使用するため、この再作成は高速です。 。要素を削除および挿入/追加するには、隣接するすべての要素(右側)をそのスペースに移動したり、そのスペースから移動する必要があります。エレメントの場所を見つけるために計算(element-zero-address + desired-index * element-size)のみを必要とするため、任意のエレメントへのアクセスは高速です。 ほとんどの場合ArrayListよりもLinkedListが優先されます。
    • LinkedList :一連のオブジェクトに裏打ちされたListで、それぞれが「前の」および「次の」隣人にリンクされています。 LinkedListは、QueueおよびDequeでもあります。要素へのアクセスは、最初または最後の要素から開始され、目的のインデックスに達するまで走査されます。挿入と削除、トラバースを介して目的のインデックスに到達するとは、新しい要素を指すように、または削除された要素をバイパスするために、すぐ隣のリンクのみを再マッピングする簡単な問題です。
  • Map :各要素に識別「キー」があるCollectionを表すインターフェイス-各要素はキー値ペア。
    • HashMap :キーが順序付けられておらず、MapによってバッキングされているHashtable
    • LinkedhashMap :キーの順序は挿入順序です。
    • TreeMap :キーがMapで順序付けられているComparator(通常は自然な順序)。
  • Queue :通常、要素が一端に追加され、他端から削除されるCollectionを表すインターフェース( FIFO:先入れ先出し)。
  • Stack :通常、要素が追加(プッシュ)および削除(ポップ)されたCollectionを表すインターフェース同じ終わり(LIFO:後入れ先出し)。
  • Deque :「二重終了キュー」の略で、通常は「デッキ」と発音されます。通常、両端にのみ追加され、両端から読み取られるリンクリスト(中央ではありません)。

基本的なコレクション図:

diagram

要素の挿入とArrayListおよびLinkedListの比較:

diagram

60
aliteralmind

さらに簡単な画像はこちらです。意図的に簡素化!

  1. コレクション(同じタイプの)「要素」と呼ばれるデータを保持するものです。これ以上具体的なことは想定されていません。

  2. リストindexed各要素がインデックスを持つデータのコレクションです。配列に似ていますが、より柔軟です。

    リスト内のデータは、挿入の順序を維持します。

    典型的な操作:n番目の要素を取得します。

  3. Set要素の袋で、各要素は1回だけです(要素は、 equals()メソッド。

    セット内のデータは、主にwhatデータが存在することを知るためだけに保存​​されます。

    一般的な操作:要素がリストに存在するかどうかを確認します。

  4. Mapはリストのようなものですが、整数インデックスで要素にアクセスする代わりに、- key、これは任意のオブジェクトです。 PHPの配列のように:)

    マップ内のデータは、キーで検索できます。

    典型的な操作:IDで要素を取得します(IDは、リストの場合のようにintだけでなく、任意のタイプです)。

違い

  • セットとマッピング:セットでは検索データ自分で、マップではキーで

  • リストとマップ:リストでは、intインデックス(リスト内の位置)で要素にアクセスし、マップでは、任意のタイプ(通常:ID)のキーで要素にアクセスします

  • リストとセット:リストでは要素はその位置によってバインドされ、複製できますが、セットでは要素は単に「存在する」(prが存在しない)と一意です(equals()またはcompareTo()の意味で SortedSet

11
Honza Zidek

簡単です。キーにマップされたキーで値を保存する必要がある場合はMapインターフェイスに移動します。そうでない場合は、重複する可能性のある値にListを使用します。

完全な説明はこちら http://javatutorial.net/choose-the-right-Java-collection 、フローチャートなどを含む

1
filip_j

共通コレクション、共通コレクション enter image description here

0