ホームページ >Java >&#&チュートリアル >Javaのコレクションとマップの違いは何ですか?

Javaのコレクションとマップの違いは何ですか?

WBOY
WBOY転載
2023-05-15 22:58:041343ブラウズ

Collection インターフェイス

Collection は最も基本的なコレクション インターフェイスであり、Collection はオブジェクトのグループ、つまりコレクションの要素を表します。コレクションによっては、同一の要素を許可するものと許可しないものがあります。ある種のものとそうでないものがあります。 Java SDK では Collection を直接継承するクラスは提供されておらず、List や Set など、Java SDK が提供するクラスはすべて Collection を継承する「サブインターフェース」です。

Collection インターフェイスを実装するすべてのクラスは、2 つの標準コンストラクターを提供する必要があります: パラメーターなしのコンストラクターは空のコレクションを作成するために使用され、Collection パラメーターを持つコンストラクターは新しいコレクションを作成するために使用されます。この新しいコレクションには、渡されたコレクションと同じ要素。後者のコンストラクターを使用すると、ユーザーはコレクションをコピーできます。

コレクション内の各要素をトラバースするにはどうすればよいですか? Collection の実際のタイプに関係なく、コレクション内の各要素に 1 つずつアクセスするために使用できるイテレータを返す iterator() メソッドがサポートされています。一般的な使用法は次のとおりです:

Iterator it = collection.iterator(); // イテレータを取得します
while(it.hasNext()) {
Object obj = it.next (); // 次の要素を取得します
}

Collection インターフェイスから派生した 2 つのインターフェイスは、List と Set です。

List インターフェイス

List は順序付けされたコレクションであり、このインターフェイスを使用すると、各要素の挿入位置を正確に制御できます。ユーザーは、Java の配列に似たインデックス (配列の添え字に似たリスト内の要素の位置) を使用して、リスト内の要素にアクセスできます。

以下で説明する Set とは異なり、List では同じ要素を使用できます。

Collection インターフェイスに必要な iterator() メソッドに加えて、List には ListIterator インターフェイスを返す listIterator() メソッドも用意されています。標準の Iterator インターフェイスと比較して、ListIterator には追加の add() とメソッドを使用すると、要素の追加、削除、設定、および前方または後方への移動が可能になります。

List インターフェイスを実装する一般的に使用されるクラスは、LinkedList、ArrayList、Vector、Stack です。

LinkedList クラス

LinkedList は List インターフェイスを実装し、null 要素を許可します。さらに、LinkedList は、LinkedList の先頭または末尾に追加の get、remove、および insert メソッドを提供します。これらの操作により、LinkedList をスタック、キュー、または両端キューとして使用できるようになります。

LinkedList には同期メソッドがないことに注意してください。複数のスレッドが同時にリストにアクセスする場合、スレッド自体がアクセス同期を実装する必要があります。解決策の 1 つは、リストの作成時に同期されたリストを構築することです。

List list = Collections.synchronizedList(new LinkedList(...));

ArrayList Class

ArrayList は可変サイズの配列を実装します。 null を含むすべての要素が許可されます。 ArrayList は同期されていません。

size、isEmpty、get、set メソッドの実行時間は一定です。ただし、add メソッドのコストは償却定数であり、n 個の要素を追加するには O(n) 時間がかかります。他の方法では実行時間が直線的になります。

各 ArrayList インスタンスには容量 (Capacity) があり、これは要素を格納するために使用される配列のサイズです。この容量は、新しい要素が追加されると自動的に増加しますが、増加アルゴリズムは定義されていません。多数の要素を挿入する必要がある場合は、挿入前に ensureCapacity メソッドを呼び出して ArrayList の容量を増やし、挿入効率を向上させることができます。
LinkedList と同様に、ArrayList も非同期です。

Vector クラス

Vector は ArrayList とよく似ていますが、Vector は同期されます。 Vector で作成された Iterator は ArrayList で作成された Iterator と同じインターフェイスを持ちますが、Vector は同期されているため、Iterator が作成されて使用されると、別のスレッドによって Vector の状態が変更されます (たとえば、要素の追加や削除など)。 , Iterator メソッドを呼び出すと ConcurrentModificationException がスローされるため、例外をキャッチする必要があります。

Stack クラス

Stack は Vector から継承し、後入れ先出しスタックを実装します。 Stack には、Vector をスタックとして使用できるようにする 5 つの追加メソッドが用意されています。基本的なプッシュ メソッドとポップ メソッド、およびピーク メソッドはスタックの先頭にある要素を取得し、空のメソッドはスタックが空かどうかをテストし、検索メソッドはスタック内の要素の位置を検出します。スタックは、作成後の空のスタックです。

Set インターフェイス

Set は、繰り返される要素を含まないコレクションです。つまり、任意の 2 つの要素 e1 と e2 は e1.equals(e2)= false になります。セットには最大 1 つの null 要素が含まれます。
明らかに、Set コンストラクターには、渡された Collection パラメーターに重複した要素を含めることができないという制約があります。
注意: 可変オブジェクトは注意して扱う必要があります。 Set 内の可変要素の状態が変化して Object.equals(Object)=true になると、いくつかの問題が発生します。

マップインターフェイス

Map は Collection インターフェイスを継承しないことに注意してください。Map はキーと値のマッピングを提供します。マップに同じキーを含めることはできず、各キーは 1 つの値のみをマップできます。 Map インターフェイスには 3 種類のセット ビューが用意されており、Map のコンテンツは、キー セットのセット、値セットのセット、またはキーと値のマッピングのセットと見なすことができます。

Hashtable クラス

Hashtable は Map インターフェイスを継承し、キーと値のマッピングのハッシュ テーブルを実装します。 null 以外の任意のオブジェクトをキーまたは値として使用できます。
データを追加するには put(key, value) を使用し、データを削除するには get(key) を使用します。これら 2 つの基本操作の時間コストは一定です。

Hashtable は、初期容量と負荷係数という 2 つのパラメーターを通じてパフォーマンスを調整します。通常、デフォルトの負荷係数 0.75 を使用すると、時間とスペースのバランスがより良くなります。負荷率を増やすとスペースを節約できますが、それに対応する検索時間が増加し、get や put などの操作に影響します。

##ハッシュテーブルを使用する簡単な例は次のとおりです。ハッシュテーブルに 1、2、3 を入力すると、それぞれのキーは「1」、「2」、「3」になります。 #ハッシュテーブルの数値 = new Hashtable();

numbers.put(“one”, new Integer(1));
numbers.put(“two”, new Integer(2));numbers。 put(“three ”, new Integer(3));


数値 (2 など) を取得するには、対応するキーを使用します:

Integer n = (Integer )numbers.get( "two");

System.out.println("two = " " n);


キーとしてのオブジェクトは、その計算によって対応する値を決定するため、ハッシュ関数の場所を指定するため、キーとして使用されるオブジェクトは hashCode メソッドとquals メソッドを実装する必要があります。 hashCode メソッドと equals メソッドは、ルート クラス Object を継承します。カスタム クラスをキーとして使用する場合は、十分に注意してください。ハッシュ関数の定義によれば、2 つのオブジェクトが同じである場合、つまり obj1.equals( obj2)=true の場合、ハッシュコードは同じである必要がありますが、2 つのオブジェクトが異なる場合、ハッシュコードは必ずしも異なるとは限りません。2 つの異なるオブジェクトのハッシュコードが同じ場合、この現象は競合と呼ばれます。競合により、ハッシュ テーブルの操作にかかる時間のオーバーヘッドが増加するため、ハッシュ テーブルの操作を高速化するために明確に定義された hashCode() メソッドを定義するようにしてください。
同じオブジェクトに異なる hashCode がある場合、ハッシュ テーブルの操作で予期しない結果が生じます (期待された get メソッドが null を返す)。この問題を回避するには、覚えておく必要があることは 1 つだけです。equals メソッドと hashCode メソッドをオーバーライドすることです。そのうちの 1 つだけを書くのではなく。ハッシュテーブルは同期です。


HashMap クラス

HashMap は Hashtable と似ていますが、HashMap が非同期で null、つまり null 値と null キーを許可する点が異なります。ただし、HashMap をコレクションとして扱う場合 (values() メソッドはコレクションを返すことができます)、その反復サブオペレーションの時間オーバーヘッドは HashMap の容量に比例します。したがって、反復操作のパフォーマンスが重要な場合は、HashMap の初期容量を高く設定しすぎたり、負荷率を低く設定しすぎたりしないでください。

WeakHashMap クラス

WeakHashMap は、キーへの「弱参照」を実装する改良された HashMap です。キーが外部から参照されなくなった場合、キーはGC によってリサイクルされます。

以上がJavaのコレクションとマップの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。