ホームページ  >  記事  >  类库下载  >  JAVA プログラミングのアイデア ---11.5 リスト、11.6 イテレータ

JAVA プログラミングのアイデア ---11.5 リスト、11.6 イテレータ

高洛峰
高洛峰オリジナル
2016-10-17 09:12:521505ブラウズ

Collection クラスの階層図 (ソースとネットワーク) は次のとおりです:

JAVA プログラミングのアイデア ---11.5 リスト、11.6 イテレータ

インターフェイス: スーパー インターフェイスとしての Iterator

public interface Iterable<T>

Iterable インターフェイス、戻り値の型が Iterable の iterator() が 1 つだけありますこのインターフェイスを実装するメソッドにより、オブジェクトを「foreach」ステートメントのターゲットにすることができます。


インターフェイス: Collection

public interface Collection<E> extends Iterable<E>

コレクション階層のルートインターフェイス。コレクションはオブジェクトのセットを表し、コレクションの要素とも呼ばれます。一部のコレクションでは重複要素 (List、Queue など) が許可されますが、その他のコレクションでは許可されません (Set など)。コレクションの中には順序付けされているもの (List、TreeSet、LinkedHashSet、TreeMap、LinkedHashMap など) もあれば、順序付けされていないものもあります (HashSet、HashMap など)。 JDK は、このインターフェイスの直接実装を提供しません。JDK は、Set や List などのより具体的なサブインターフェイスの実装を提供します。このインターフェイスは通常、最大限の汎用性が必要な場合にコレクションを渡し、コレクション上で操作するために使用されます。

インターフェース: List

public interface List<E> extends Collection<E>

順序付きコレクション (シーケンスとも呼ばれます)。 List インターフェイスには、Collection インターフェイスに基づいた多数のメソッドが追加されており、リスト内の各要素の挿入位置または削除位置を正確に制御できます。ユーザーは、整数インデックス (リスト内の位置) に基づいて要素にアクセスし、リスト内の要素を検索できます。

List インターフェイスは、Collection インターフェイスで指定されているもの以外に、反復子のコントラクト、add、remove、equals、および hashCode メソッドにいくつかの他の規則を追加します。

List インターフェースは、リスト要素への位置決め (インデックス付け) アクセスメソッドを提供します。リスト (Java 配列など) は 0 から始まります。これらの操作は、一部の実装 (LinkedList クラスなど) のインデックス値に比例した時間で実行される可能性があることに注意してください。したがって、特定の実装が不明な場合は、通常、インデックスを使用してリストを走査する (for ループ) よりも、リストの要素を反復処理する (Iterator または foreach ループ) 方が適切です。

List インターフェイスは、ListIterator と呼ばれる特別なイテレータを提供します。このイテレータでは、Iterator インターフェイスが提供する通常の操作に加えて、要素の挿入と置換、および双方向アクセスも可能です。リスト内の指定された位置から始まるリスト反復子を取得するメソッドも提供されます。

抽象クラス: AbstractCollection

public abstract class AbstractCollection<E> extends Object implements Collection<E>

このクラスは、Collection インターフェースの List、Set、および Queue インターフェースを実装する実装クラスを提供して、実装の必要性を最小限に抑えることができます。これはインターフェースに必要な作業です。

このインターフェースは、サイズとイテレータを除く他のインターフェースを Collection に実装し、add メソッドを制限します。

不変コレクションを実装するには、プログラマはこのクラスを拡張し、イテレータおよびサイズメソッドの実装を提供するだけで済みます。 (イテレーター・メソッドによって返されるイテレーターは、hasNext および next を実装する必要があります。)

変更可能なコレクションを実装するには、プログラマーは、(このクラスを拡張し、イテレーターおよびサイズ・メソッドの実装を提供することに加えて) このクラスの add メソッドをさらに書き直す必要があります (それ以外の場合は、UnsupportedOperationException がスローされます)。また、 iterator メソッドによって返されるイテレーターも、その delete メソッドを実装する必要があります。

抽象クラス: AbstractList

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>

このクラスは、List インターフェースのバックボーン実装を提供し、配列 ArrayList などの「ランダム アクセス」データ ストアによってサポートされるこのインターフェースの実装に必要な作業を最小限に抑えます (つまり、List を実装します)インターフェースは、Collection インターフェースの外側にメソッドを拡張します)。 Collection インタフェースを実装するメソッドの場合、このクラスは AbstractCollection 抽象クラスを継承して実装されます。このクラスの未実装メソッドには get(int Index) および size() が含まれ、set(int Index, E element)、add(int Index, E element)、remove(int Index)、add(E element) メソッドは次のとおりです。制限。

連続アクセスデータ(LinkedListなど)の場合は、このクラスの代わりにAbstractSequentialListを最初に使用する必要があります。

変更不可能なリストを実装するには、プログラマはこのクラスを拡張し、get(int) メソッドと size() メソッドの実装を提供するだけで済みます。

変更可能なリストを実装するには、プログラマはさらに set(int, E) メソッドをオーバーライドする必要があります (そうしないと UnsupportedOperationException がスローされます)。リストが可変サイズの場合、プログラマはさらに add(int, E) メソッドとremove(int) メソッドをオーバーライドする必要があります。

クラス: ArrayList

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable

ArrayList は、List インターフェイスの可変サイズの配列ベースの実装です。最下層は配列実装を使用しているため、優れたランダム アクセス機能を備えていますが、指定された場所での挿入や削除などの操作には効率的ではありません。

各 ArrayList インスタンスには容量があります。容量は、リスト要素を格納するために使用される配列のサイズを指します。ArrayList の容量サイズが指定されていない場合、作成されるインスタンスのデフォルトの容量は 10 です。 ArrayList に要素が追加されると、その容量は自動的に増加します。

このクラスの iterator メソッドと listIterator メソッドによって返されるイテレータはフェイルファストです。イテレータが作成された後は、イテレータ自身の delete メソッドまたは add メソッドによってリストの構造が変更されない限り、リストはいかなる方法でも変更されません。変更されると、イテレータは ConcurrentModificationException をスローします。したがって、同時変更に直面すると、反復子はすぐに完全に失敗し、将来の不特定の時点で任意の非決定的な動作が発生する危険を冒すことはありません。


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