私は現在、次のことを信じています:
HashMap
を使用しますArrayList
を使用します私は一般的に正しいですか?これが正しくない状況はありますか?
通常、はい、あなたは正しいです。 LinkedHashMap という結合されたデータ構造もあり、予測可能な順序だけでなく、任意の要素への高速アクセスを提供します。
ただし、ArrayListとHashMapは、それぞれListインターフェイスとMapインターフェイスの2つの実装にすぎないことに注意してください。より具体的な要件により適している可能性のあるそれぞれの実装は他にもあります。たとえば、LinkedListは、特定のキュー/デキュー要件に対してArrayListよりも高いパフォーマンスを提供する場合があります。
マップは マップ、または「連想配列」 です。キー->値のレイアウトがあります。一方、リストは list であり、要素の順序付けられたコレクションです。
より直接的な比較は、おそらくSetとList:これらは両方とも値を保持し、リストは明示的に順序付けられます(要素#xを取得できます)、セットは(通常)順序付けられていません(ただし、 SortedSet である場合を除きます。この場合、コンパレータによって反復順序が順序付けされます)。
SetとListの2つの最も一般的な実装は、HashSetとArrayListです。要素がarraylist(contains(element))に属しているかどうかを確認するには、その要素のすべての要素を繰り返し処理し、equals()メソッドを使用して要素を見つけたかどうかを確認します。要素がハッシュセットに属しているかどうかを確認するには、まず要素のhashCode()が計算され、次にこの要素shouldが存在する位置に「直接」移動し、存在するかどうかを確認します。
したがって、ArrayListとHashSetの大きな違いは、contains()の速度です。
リストでは、セットでできることに加えて、要素番号xを要求できます。これは、すべての要素を追加、削除、提示するかどうか(含まれる)、繰り返します。
マップでは、リストを使用する場合のようにインデックスではなく、キーで要素を要求できます。
HashSetは現在、キーと値の関係の値部分が使用されていないHashMapによって単に実装されています。これは完全に馬鹿げており、HashSetに挿入されるすべての要素に対して、少なくとも4バイトを無駄にする以外に何も使用できません。
私はあなたが一般的に正しいと言いますが、完全に正確ではありません。データの取得にはHashMap
を使用しますが、常にランダムではありません。繰り返しにはArrayList
を使用しますが、インデックスを介したルックアップにも使用できます。
より一般的には、ルックアップ、つまり辞書、キャッシュ、リポジトリなどのキーに基づいて何かを効率的に取得する必要がある場合、Map
実装を使用します。
List
実装を使用するのは、データを反復処理できるデータ構造だけが必要な場合、通常は事前に決定された順序または予測可能な順序でデータを必要とする場合です。
つまり、Map
sをインデックスデータ構造として使用し、List
sを通常の配列と同じように使用します。
配列から取得するよりも、マップを使用して特定の項目にアクセスする方がはるかに高速であることを忘れないでください(インデックスがある場合を除き、キーは常に正しい値を取得しますが、新しい要素が挿入されたり、古い要素が削除されたりすると、インデックスが機能しない場合があります)。
私にとっては、コレクション内のアイテムの順序を気にするかどうかです。順序を気にする場合は、ArrayListを使用します。注文を気にしない場合(アイテムの束を保存するだけの場合)、HashMapを使用できます。
私は少し同意しません。私にとっては、アイテムの取得方法によって異なります。それらの順序(正確にはインデックスによる)のようなものに基づいてこれを行いたい場合、ArrayList(または配列)のような線形構造を使用する傾向があります。アイテムを検索する必要がある場合は、HashMapのようなマップ構造を使用します。
別の複雑な要因は、ダンが指摘したように、挿入と順序に関係しています。