ホームページ  >  記事  >  Java  >  JAVAコレクションクラスの概要

JAVAコレクションクラスの概要

巴扎黑
巴扎黑オリジナル
2017-07-20 13:17:111466ブラウズ

1. セットと配列

配列 (基本的なデータ型を格納できる) は、オブジェクトを格納するために使用されるコンテナーですが、配列の長さは固定されており、オブジェクトの数が不明な場合の使用には適していません。

コレクション (オブジェクトのみを保存でき、オブジェクトの種類は異なる場合があります) は可変長で、ほとんどの状況で使用できます。

2. 階層関係

図に示すように、実線の枠が実装クラス、折れ線の枠が抽象クラス、点線の枠がインターフェースです

Collection インターフェースは、コレクション クラスのルート インターフェースです。Java には、このインターフェースを直接実装するクラスはありません。しかし、それは継承され、Set と List という 2 つのインターフェイスが生成されました。セットには重複した要素を含めることはできません。リストは順序付けされたコレクションであり、繰り返しの要素を含めることができ、インデックスによるアクセスを提供します。

Map は Java.util パッケージの別のインターフェイスであり、Collection インターフェイスとは関係がなく、互いに独立していますが、両方ともコレクション クラスの一部です。マップにはキーと値のペアが含まれています。マップには重複したキーを含めることはできませんが、同じ値を含めることはできます。

Iterator、すべてのコレクション クラスは、コレクション内の要素を走査するためのインターフェイスである Iterator インターフェイスを実装します。これには、主に次の 3 つのメソッドが含まれます:
1.hasNext() 次の要素があるかどうか。
2.next() は次の要素を返します。
3.remove() は現在の要素を削除します。

3. いくつかの重要なインターフェイスとクラスの紹介

1. リスト (順序付き、反復可能)
リストに格納されるオブジェクトはインデックスに焦点を当てており、高速クエリのための一連のインデックス関連のメソッドがあります。スピード。リスト コレクションにデータを挿入または削除すると、後続のデータの移動が伴い、すべてのデータの挿入と削除が遅くなるからです。

2. Set (順序付けされていないため、繰り返すことはできません)
Set に保存されているオブジェクトは順序付けされておらず、繰り返すことはできません。セット内のオブジェクトは特定の方法で並べ替えられず、単にセットに追加されます。

3. マップ (キーと値のペア、一意のキー、一意でない値)
マップ コレクションには、キーと値のペアを繰り返すことはできませんが、値は繰り返すことができます。マップ コレクションを走査する場合は、まずキーのセット コレクションを取得し、セット コレクションを走査して、対応する値を取得します。

比較は次のとおりです:

いいえHashMapTreeMapは(バイナリソートツリーを使用)

4. トラバーサル

次の 4 つの一般的な出力メソッドがクラス セットで提供されます:

1) イテレーター: 最も一般的に使用される出力メソッドである反復出力。

2) ListIterator: Iterator のサブインターフェイスであり、List の内容を出力するために特に使用されます。

3) foreach出力: JDK1.5以降に提供された、配列または集合を出力できる新しい関数です。

4) for ループ

のコード例は次のとおりです:

for の形式: for (int i=0;i

の形式foreach: for (int i : arr) {...}

イテレータの形式:
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); ...}

5. ArrayList と LinkedList

ArrayList と LinkedList の間に使用方法の違いはありませんが、機能には依然として違いがあります。 LinkedList は、追加と削除が多くクエリ操作が少ない状況でよく使用されますが、ArrayList はその逆です。

6. マップコレクション

実装クラス: HashMap、Hashtable、LinkedHashMap、TreeMap

HashMap

HashMap は、キーの HashCode 値に従ってデータを格納します。アクセス速度が速く、トラバース時にデータを取得する順序は完全にランダムです。 HashMap はキーオブジェクトを繰り返すことができないため、最大でも 1 つのレコードのキーを Null にすることができ、複数のレコードの値を Null にすることができます。

Hashtable

Hashtable は HashMap に似ています。 HashMap のスレッドセーフ バージョンです。スレッド同期をサポートしています。つまり、Hashtable に書き込むことができるのは常に 1 つのスレッドだけです。これにより、Hashtale は書き込み時に遅くなります。違いは、Dictionary クラスから継承することです。同時に、記録されたキーまたは値を null にすることはできません。

ConcurrentHashMap

スレッドセーフでロック分離。 ConcurrentHashMap は、内部でセグメントを使用してこれらのさまざまな部分を表します。各セグメントは実際には小さなハッシュ テーブルであり、独自のロックを持っています。複数の変更操作は、異なるセグメントで実行される限り、同時に実行できます。

LinkedHashMap

LinkedHashMap は、Iteraor で LinkedHashMap を走査する際に、必ず最初に取得されたレコードが最初に挿入されます。走査中は HashMap よりも遅くなりますが、HashMap の特性をすべて備えています。

TreeMap

TreeMap は、保存するレコードをキーに従って並べ替えることができる SortMap インターフェイスを実装しています。イテレーターを使用する場合は、並べ替えコンパレーターを指定することもできます。 TreeMap を走査し、取得したレコードをソートします。キー値を空にしたり、非同期にすることはできません。

マップ トラバーサル

最初のタイプ: KeySet()
マップ内のすべてのキーをセット コレクションに保存します。 set にはイテレータがあるためです。すべてのキーは、get メソッドに基づいて反復的に取得できます。各キーに対応する値を取得します。 keySet(): 反復後、キーは get() を通じてのみ取得できます。
データ行の主キーを取得する際に HashMap.keySet() メソッドが使用され、このメソッドによって返される Set 結果のデータが順序どおりに配置されないため、取得される結果は順序が狂います。
一般的な使用法は次のとおりです:
Map map = new HashMap();
map.put("key1","lisi1");
map.put("key2","lisi2");
map.put(" key3" ,"lisi3");
map.put("key4","lisi4");
//まず、マップ コレクション内のすべてのキーのセット コレクションを取得します keyset()
イテレーター it = map.keySet() .iterator() ;
//イテレータを取得します
while(it.hasNext()){
Object key = it.next();
System.out.println(map.get(key));
}

2 番目:entrySet()
Set>entrySet() //このマップに含まれるマッピング関係の Set ビューを返します。 (リレーションシップはキーと値のペアです)、つまり、(キーと値) 全体が 1 対 1 で Set コレクションに格納されます。 Map.Entry はマッピング関係を表します。 entrySet(): 繰り返しの後、キーと値は e.getKey() と e.getValue() によって取得できます。返されるのは Entry インターフェイスです。
一般的な使用法は次のとおりです:
Map map = new HashMap();
map.put("key1","lisi1");
map.put("key2","lisi2");
map.put(" key3" ,"lisi3");
map.put("key4","lisi4");
//マップコレクション内のマッピング関係を取り出し、セットコレクションに格納します
イテレーター it = map.entrySet() .iterator() ;
while(it.hasNext()){
Entry e =(Entry) it.next();
System.out.println("Key"+e.getKey () + "値は " + e.getValue ());
}
より効率的な 2 番目のメソッド、entrySet() メソッドを使用することをお勧めします。
keySet は実際には 2 回走査されます。1 回目はイテレータに変換するため、もう 1 回目は HashMap からキーの値を取得します。エントリセットは最初にのみ走査し、キーと値の両方をエントリに入れるため、処理が高速になります。 2 つのトラバース間のトラバース時間の違いは依然として明らかです。

7. 主な実装クラス

Vector と ArrayList の違いのまとめ 1. Vector はスレッド同期なのでスレッドセーフですが、arraylist はスレッド非同期なので安全ではありません。スレッドの安全性要素が考慮されていない場合は、通常、arraylist を使用する方が効率的です。
2. コレクション内の要素の数が現在のコレクション配列の長さより大きい場合、ベクトルの増加率は現在の配列の長さの 100%、配列リストの増加率は現在の配列の長さの 50% になります。コレクション内で比較的大量のデータを使用する場合、ベクトルを使用すると一定の利点があります。
3. 指定した場所のデータを検索する場合、vector と arraylist で使用される時間は同じです。データに頻繁にアクセスする場合は、この時点で Vector と arraylist の両方を使用できます。また、指定した位置を移動すると後続のすべての要素が移動する場合は、この時点で linklist の使用を検討する必要があります。これは、データを指定した位置に移動し、他の要素は移動しないためです。
ArrayList と Vector は配列を使用してデータを保存するため、実際に保存されるデータよりも多くの要素を追加および挿入できますが、データの挿入には配列の移動などのメモリ操作が必要になります。 Vector は同期メソッド (スレッド安全性) を使用するため、シリアル番号によるデータのインデックス付けを実装する ArrayList よりもパフォーマンスが悪くなります。ただし、データを挿入するときに必要なのは、この項目の前後の項目で十分であるため、複数回挿入する方が高速です。

arraylist と linkedlist

1.ArrayList は動的配列に基づいたデータ構造を実装し、LinkedList はリンク リストに基づいたデータ構造を実装します。
2. LinkedList はポインタを移動する必要があるため、ランダム アクセスで取得および設定する場合は、LinkedList よりも ArrayList の方が優れています。
3. 新規および削除操作の追加および削除では、ArrayList はデータを移動する必要があるため、LinedList の方が有利です。これは実際の状況によって異なります。単一のデータのみを挿入または削除する場合は、ArrayList の方が LinkedList よりも高速です。ただし、データをバッチでランダムに挿入および削除する場合、データの一部が ArrayList に挿入されるたびに、挿入ポイントとその後のすべてのデータを移動する必要があるため、LinkedList の速度は ArrayList よりもはるかに優れています。

HashMap と TreeMap

1. HashMap はハッシュコードを使用してコンテンツを迅速に検索しますが、TreeMap 内のすべての要素は特定の固定順序を維持する必要がある場合は、TreeMap を使用する必要があります (HashMap では要素の順序は変わりません)。修理済み)。
2. Map 内の要素を挿入、削除、検索するには、HashMap が最適です。ただし、自然な順序またはカスタム順序でキーを反復処理する場合は、TreeMap の方が適しています。 HashMap を使用するには、追加されたキー クラスが hashCode() およびquals() の実装を明確に定義する必要があります。
2 つのマップの要素は同じですが、順序が異なるため、異なる hashCode() になります。
同じテストを実行します。
HashMap では、同じ値のマップは異なる順序であり、equals は false です。
TreeMap では、同じ値のマップは異なる順序であり、equals は true であり、treeMap がでのequals()は整理されます。

HashTable と HashMap

1. 同期性: Hashtable はスレッドセーフ、つまり同期的ですが、HashMap はスレッドセーフですが同期的ではありません。
2. HashMap では 1 つの null キーと複数の null 値が許可されます。
3. ハッシュテーブルのキーと値を null にすることはできません。

順序付けされているかどうか

要素の繰り返しが許可されているかどうか

コレクション

いいえ

はい

リスト

はい

はい

セット

抽象セット

いいえ

いいえ

HashSet

データのマッピングと保存にはキーと値を使用します。キーは一意である必要があり、値は繰り返すことができます

以上がJAVAコレクションクラスの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。