Javaコレクションフレームワークの概要



Overview Java Collection Framework



通常、プログラムは、プログラムの実行時間に応じて作成するオブジェクトの数を知る必要があります。しかし、プログラムが実行されない場合、プログラム開発の段階では、必要なオブジェクトの数、またはその正確なタイプさえもわかりません。これらの従来のプログラミングニーズを満たすために、いつでもどこでも任意の数のオブジェクトを作成できる必要があり、これらのオブジェクトに対応するために何を使用する必要がありますか?最初に配列について考えましたが、配列は均一なタイプのデータしか保持できず、その長さは固定されているので、どうすればよいでしょうか。コレクションが誕生しました!

1つは、Javaコレクションのフレームワーク図です。

画像



簡略図を以下に示します

画像



その中で、リスト、セット、マップは、コレクションの3つの主要なカテゴリと見なすことができます。 ListとSetはどちらも、Collectionインターフェイスから継承します。コレクションインターフェイスが実装されています イテレータ インターフェース、これはコレクション内の要素をトラバースするために使用されるインターフェースであり、主にhashNext()next()remove() 3つのメソッドです。サブインターフェイス ListIterator これには、add()previous()hasPrevious()の3つのメソッドが追加されています。 Iteratorインターフェースを実装する場合、コレクション内の要素をトラバースするときは、逆方向にのみトラバースできます。トラバースされた要素は再びトラバースされません。通常、順序付けされていないコレクションはHashSetなどのこのインターフェイスを実装し、これらの要素は通常、順序付けられたコレクションがLinkedIteratorインターフェイスを実装します。このインターフェースを実装するコレクションは、両方向にトラバースできます。 ArrayListなど、next()を介して次の要素にアクセスし、previous()を介して前の要素にアクセスできます。

Javaのリストは、非常に一般的に使用されるデータ型です。リストは注文されたコレクションです。 Listには、それぞれArrayList、Vector、LinkedListの3つの実装クラスがあります。

すべてのコレクションクラスは、java.utilパッケージにあります。 Javaのコレクションクラスは、主に2つのインターフェイスCollectionとMapから派生しています。



2、イテレータインターフェイス

IteratorインターフェースもJavaコレクションフレームワークのメンバーですが、CollectionシリーズおよびMapシリーズコレクションと同じではありません。CollectionシリーズコレクションおよびMapシリーズコレクションは主に他のオブジェクトを保持するために使用され、Iteratorは主にトラバースするために使用されます。 (つまり、繰り返しアクセスする)コレクションコレクションIteratorオブジェクトの要素は、イテレーターとも呼ばれます。

Iteratorインターフェースでは、次の4つのメソッドが定義されています。

boolean hasNext():反復コレクション内の要素がトラバースされていない場合はtrueを返します。

Object next():セット内の次の要素を返します。

void remove() :コレクション内の前の次のメソッドによって返された要素を削除します

void forEachRemaining(Consumer action)、これはJava 8 for Iteratorによって追加されたデフォルトのメソッドであり、Lambda式を使用してコレクション要素をトラバースできます。

Iteratorを使用して、コレクション内の要素を反復処理します。

public class IteratorDemo { public static void main(String[] args) { Collection<String> coll = new ArrayList<String>() coll.add('Zhang San') coll.add('Li Si') coll.add('Wing Five') Iterator<String> it = coll.iterator() while(it.hasNext()){ //Determine whether there is an iterated element String s = it.next()//Get the iterated element System.out.println(s) } } }

注:コレクション要素を削除するときに、コレクションにこれ以上要素がなく、イテレーターの次のメソッドを引き続き使用すると、コレクション要素がないというjava.util.NoSuchElementExceptionエラーが発生します。

実現原理

コレクションをトラバースするときは、最初にtコレクションのiterator()メソッドを呼び出してイテレーターオブジェクトを取得し、次にhashNext()メソッドを使用して、コレクションに次の要素があるかどうかを判断します。存在する場合は、next( )要素を取り出す方法。それ以外の場合は説明します。コレクションの終わりに達したので、要素のトラバースを停止します。

Iteratorオブジェクトがコレクションをトラバースするとき、コレクション内の要素を追跡するために内部的にポインターを使用します。

イテレータの次のメソッドを呼び出す前に、イテレータのインデックスは最初の要素の前にあり、どの要素も指していません。イテレータの次のメソッドが初めて呼び出されると、イテレータのインデックスは1ビット戻り、最初の要素をポイントして要素を返します。次のメソッドが再度呼び出されると、イテレータのインデックスは2番目の要素を指し、要素を返します。これは、hasNextメソッドがfalseを返し、コレクションの終わりに到達したことを示し、ペアが終了するまで続きます。要素のトラバース。

3、コレクションインターフェイス

コレクションインターフェイスは、要素を操作するための多くのメソッドを定義しますが、より一般的に使用されるのは次のとおりです。

boolean add(E e) :指定されたオブジェクトを現在のコレクションに追加します。

void clear() :コレクション内のすべての要素をクリアします。

boolean remove(E e) :現在のコレクション内の指定されたオブジェクトを削除します。

boolean contains(E e) :指定されたオブジェクトが現在のコレクションに含まれているかどうかを判別します。

boolean isEmpty() :現在のコレクションが空かどうかを判別します。

int size() :コレクション内の要素の数を返します。

Object[] toArray() :コレクション内の要素を配列に格納します。

4、リストとセット

ListとSetは、Collectionインターフェイスで一般的に使用される2つのサブインターフェイスです。

リスト

Listコレクションは、順序付けられたコレクションを表します。コレクション内の各要素には対応する順次インデックスがあり、重複要素が許可されており、指定された位置にある要素にはインデックスを介してアクセスできます。 Listには、それぞれArrayList、Vector、LinkedListの3つの実装クラスがあります。

一般的な方法:

public void add(int index, E element) :指定された要素をコレクション内の指定された位置に追加します。

public E get(int index) :コレクション内の指定された位置にある要素を返します。

public E remove(int index) :リスト内の指定された位置にある要素を削除し、削除された要素を返します。

public E set(int index, E element) :コレクション内の指定された位置にある要素を指定された要素に置き換え、値の更新前に要素を返します。

セットする

セットは独特の性質に注意を払います。システムセットは、無秩序な要素を格納するために使用され(入金と出金の順序は必ずしも同じではありません)、値を繰り返すことはできません。オブジェクトの同等性の本質は、オブジェクトのhashCode値です(Javaは、シリアル番号を計算するためにオブジェクトのメモリアドレスに基づいています)。 2つの異なるオブジェクトを等しいと見なす場合は、オブジェクトのhashCodeメソッドとequalsメソッドをオーバーライドする必要があります。

Setの一般的なサブクラスは次のとおりです。

  • HashSet
  • LinkedHashSet
  • TreeSet

セットとリストの違い

  • Setインターフェイスインスタンスは、順序が正しくなく、繰り返しのないデータを格納します。 Listインターフェイスインスタンスは、順序付けられた繰り返し可能な要素を格納します。
  • セットの検索効率が低く、削除と挿入の効率が高く、挿入と削除によって要素の位置が変化することはありません。
  • リストは配列に似ており、実際に格納されているデータの長さに応じて動的に自動的にリストの長さを増やすことができます。要素の検索は効率的ですが、挿入と削除は他の要素の位置を変更するため、非効率的です。

5、地図

マップは、マッピング関係(key-vlaue)でデータを保存するために使用されます。 Mapのキーを繰り返すことはできません。つまり、同じMapオブジェクトの2つのキーは、equalsメソッドで比較すると常にfalseを返します。

多くのメソッドがマップインターフェイスで定義されていますが、一般的に使用されるメソッドは次のとおりです。

  • public V put(K key, V value) :指定されたキーと指定された値をMapコレクションに追加します。

  • public V remove(Object key) :指定されたキーに対応するキーと値のペア要素をMapコレクションから削除し、削除された要素の値を返します。

  • public V get(Object key)指定されたキーに従って、Mapコレクションで対応する値を取得します。

  • public Set keySet() :Mapコレクションのすべてのキーを取得し、Setコレクションに保存します。

  • public Set entrySet() :Mapコレクション内のすべてのKey-Valueペアオブジェクトのコレクション(Setコレクション)を取得します。

注意:

  1. Mapコレクションは、イテレーターまたはforeachを使用して直接トラバースすることはできません。ただし、Setに変換して使用することはできます

  2. マップはコレクションインターフェイスを継承しません

  3. マップは、値のマッピングへの鍵を提供します。マップに同じキーを含めることはできず、各キーは1つの値のみをマップできます。