Javaコレクションを繰り返すためにJDKが提供する反復インターフェイスをよく使用します。
iterator iterator = list.iterator(); while(iterator.hasnext()){string string = iterator.next(); //何か}}反復は、実際には移動として単純に理解できます。これは、さまざまな容器内のすべてのオブジェクトのトラバーサルを標準化するメソッドクラスです。これは非常に典型的なデザインパターンです。イテレーターパターンは、収集クラスを通過するために使用される標準アクセス方法です。さまざまな種類のコレクションクラスからのアクセスロジックを抽象化するため、クライアントにコレクションの内部構造を公開することを避けます。これは、イテレーターがない場合に対処する方法です。次のように:
配列には、サブスクリプトを使用して処理します。
int [] arrays = new Int [10];
これがArrayListの処理方法です。
List <String> list = new ArrayList <String>(); for(int i = 0; i <list.size(); i ++){string string = list.get(i); //何かを行う}両方の方法について、コレクションの内部構造を常に事前に知っています。アクセスコードとコレクション自体は緊密に結合されており、アクセスロジックをコレクションクラスとクライアントコードから分離することはできません。同時に、各コレクションはトラバーサル法に対応し、クライアントコードを再利用できません。実際のアプリケーションでは、上記の2つのセットを統合することは非常に厄介です。したがって、上記の問題を解決するために、イテレーターモードは空いており、常に同じロジックを使用してコレクションを通過します。これにより、クライアント自体がコレクションの内部構造を維持する必要がなくなり、すべての内部状態はIteratorによって維持されます。クライアントは、コレクションクラスを直接扱うことはありません。常にiteratorを制御し、「フォワード」、「後方」、「現在の要素を取得」コマンドを送信し、コレクション全体を間接的に通過できます。
上記は、イテレーターパターンの簡単な説明です。 JavaのIteratorインターフェイスを見て、それがどのように実施されるかを見てみましょう。
1。Java.util.iterator
Javaでは、Iteratorはインターフェイスであり、反復的な基本ルールのみを提供します。 JDKでは、これは次のように定義されています。コレクションを繰り返します。 Iteratorは、Java Collections Frameworkの列挙に取って代わります。反復因子と列挙には2つの違いがあります。
1.イテレーターにより、発信者は、明確に定義されたセマンティクスを使用して、反復中にイテレーターが指し示したコレクションから要素を削除できます。
2。メソッド名が改善されました。
インターフェイスの定義は次のとおりです。
public interface iterator {boolean hasnext(); Object next(); void remove();}で:
Object next():反復因子が単に交差する要素への参照を返します。返品値はオブジェクトであり、必要なタイプにキャストする必要があります。
boolean hasnext():アクセスするコンテナに利用可能な要素があるかどうかを判断します
void remove():イテレーターが交差したばかりの要素を削除します
私たちにとっては、next()とhasnext()を使用して反復を完了する必要があります。次のように:
for(iterator it = c.iterator(); it.hasnext();){object o = it.next(); //何かをする}以前の説明は、反復因子には大きな利点があるということです。つまり、セットの内部結果を知る必要はありません。セットの内部構造と状態は、Iteratorによって維持されます。統一された方法hasnext()およびnext()を使用して、次の要素を判断して取得します。特定の内部実装については、心配する必要はありません。しかし、資格のあるプログラマーとして、イテレーターの実装を把握することが非常に必要です。 ArrayListのソースコードを以下に分析します。
2。各コレクションのイテレーターの実装
ArrayListのIterator実装を分析しましょう。実際、アレイリスト、ハッシュセット、ツリーセットのデータ構造を理解して内部的に実装した場合、それらがイテレータを実装する方法について確信します。 ArrayListの内部実装は配列を使用するため、対応する位置のインデックスを記録するだけで、そのメソッドの実装は比較的簡単です。
2.1。 ArrayListのイテレーター実装
ArrayListの内部は、最初に内側のクラスITRを定義します。これは、次のようにIteratorインターフェイスを実装します。
プライベートクラスITRはIterator <e> {//何かをする}を実装していますArrayListのIterator()メソッドが実装されています。
public iterator <e> iterator(){return new itr();}したがって、arrayList.iterator()の方法は、ITR()内部クラスを返します。したがって、今では気にする必要があるのは、ITR()内側クラスの実装です。
ITR内で3つのINTタイプの変数が定義されています:カーソル、ラストレット、およびspeddEctModCount。ここで、カーソルは次の要素のインデックス位置を表し、ラストレットは前の要素のインデックス位置を表します
int cursor; int lastret = -1; int expectsModCount = modCount;
カーソルとラストレットの定義から、ラストレットは常にカーソルよりも少ないため、hasNext()の実装方法は非常に簡単であることがわかります。カーソルとラストレットが等しいかどうかを判断するだけです。
public boolean hasnext(){return cursor!= size;} Next()の実装は実際には比較的単純です。カーソルインデックスの位置で要素を返してから、カーソルとラストレットを変更するだけです
public e next(){checkforcomodification(); int i = cursor; //インデックスの位置を記録するif(i> = size)//取得要素がコレクション要素の数よりも大きい場合、例外がスローされる新しいnosuchelementexception(); object [] elementData = arrayList.this.ElementData; if(i> = elementData.length)を新しいconcurrentModificationException(); cursor = i + 1; // cursor + 1return(e)elementData [lastret = i]; //ラストレット + 1とカーソルの要素を返します} CheckForcomodification()は、主にセットの変更の数が合法か、つまり、トラバーサルプロセス中にセットが変更されたかどうかを判断するために使用されます。 ModCountは、ArrayListコレクションの変更の数を記録するために使用され、0に初期化され、Collectionが1回変更されるたびに(内部更新が構造にカウントされない)、その他のメソッド、ModCount + 1など、ModCountが変更されていない場合、コレクションのコンテンツが変更されていないことを意味します。このメカニズムは、主にアレイリストコレクションの高速障害メカニズムを実装するために使用されます。 Javaコレクションでは、コレクションの大部分が急速な障害メカニズムを持っています。私はここではそれについては話しません、そして私は後でそれについて話します。したがって、横断プロセス中にエラーがないことを確認するには、横断プロセス中にコレクションに構造的な変更がないことを確認する必要があります(削除方法を除く)。例外エラーが発生した場合、キャッチ後にプログラムが処理しないのではなく、プログラムにエラーがあるかどうかを慎重に確認する必要があります。
final void checkforcomodification(){if(modcount!= expectsmodcount)throw new concurrentModificationException;} remove()メソッドは実装であり、アレイリスト自体のremove()メソッドを呼び出してラストレット位置要素を削除し、modcountを変更します。
public void remove(){if(lastret <0)throw new IllegalStateException(); checkforcomodification(); try {arraylist.this.remove(lastret); cursor = lastret = -1; expectionmodcount = modcount;} catch(in bundsexcepsecsex(){、show furrirentmodificated()上記は、編集者が紹介したJavaコレクションのイテレーターイテレーションの実装方法です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!