この質問では C++ 11で標準ライブラリコンテナを効率的に選択するにはどうすればよいですか? は、C++コレクションを選択するときに使用する便利なフローチャートです。
これはどのコレクションを使用すべきかわからない人にとって有用なリソースだと思ったので、Javaの同様のフローチャートを見つけようとしましたが、できませんでした。
Javaでプログラミングするときに使用する適切なコレクションを選択するのに役立つリソースと「チートシート」は何ですか?使用するList、Set、Mapの実装をどのように知るのでしょうか?
同様のフローチャートが見つからなかったため、自分で作成することにしました。
このフローチャートは、同期アクセス、スレッドセーフなど、またはレガシーコレクションのようなものをカバーしようとはしていませんが、3つの標準Sets、3 standardMapsと2つのstandardLists。
この画像はこの回答用に作成され、 Creative Commons Attribution 4.0 International License。 でライセンスされています。==最も簡単な属性は、この質問またはこの回答にリンクすることです。
その他のリソース
おそらく最も有用な他のリファレンスは、それぞれの Collection を説明するOracleドキュメントの次のページです。
HashSet vs TreeSet
HashSet
またはTreeSet
をいつ使用するかの詳細な説明があります: Hashset vs Treeset
ArrayList vs LinkedList
Collection
:「要素」と呼ばれるアイテムの順序付けられていない「バッグ」を表すインターフェイス。 「次の」要素は未定義(ランダム)です。
Set
:重複のないCollection
を表すインターフェイス。HashSet
: Set
によって裏付けられたHashtable
。注文が重要でない場合の、最も高速で最小のメモリ使用量。LinkedHashSet
:挿入順序で要素を関連付けるリンクリストを追加したHashSet
。 「次の」要素は、最後から2番目に挿入された要素です。TreeSet
:Set
の要素は 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
:「二重終了キュー」の略で、通常は「デッキ」と発音されます。通常、両端にのみ追加され、両端から読み取られるリンクリスト(中央ではありません)。基本的なコレクション図:
要素の挿入とArrayList
およびLinkedList
の比較:
さらに簡単な画像はこちらです。意図的に簡素化!
コレクション(同じタイプの)「要素」と呼ばれるデータを保持するものです。これ以上具体的なことは想定されていません。
リストはindexed各要素がインデックスを持つデータのコレクションです。配列に似ていますが、より柔軟です。
リスト内のデータは、挿入の順序を維持します。
典型的な操作:n番目の要素を取得します。
Setは要素の袋で、各要素は1回だけです(要素は、 equals()
メソッド。
セット内のデータは、主にwhatデータが存在することを知るためだけに保存されます。
一般的な操作:要素がリストに存在するかどうかを確認します。
Mapはリストのようなものですが、整数インデックスで要素にアクセスする代わりに、- key、これは任意のオブジェクトです。 PHPの配列のように:)
マップ内のデータは、キーで検索できます。
典型的な操作:IDで要素を取得します(IDは、リストの場合のようにint
だけでなく、任意のタイプです)。
セットとマッピング:セットでは検索データ自分で、マップではキーで。
リストとマップ:リストでは、int
インデックス(リスト内の位置)で要素にアクセスし、マップでは、任意のタイプ(通常:ID)のキーで要素にアクセスします
リストとセット:リストでは要素はその位置によってバインドされ、複製できますが、セットでは要素は単に「存在する」(prが存在しない)と一意です(equals()
またはcompareTo()
の意味で SortedSet
)
簡単です。キーにマップされたキーで値を保存する必要がある場合はMapインターフェイスに移動します。そうでない場合は、重複する可能性のある値にListを使用します。
完全な説明はこちら http://javatutorial.net/choose-the-right-Java-collection 、フローチャートなどを含む