イテレータに関する詳細なチュートリアル

Y2J
リリース: 2017-05-12 09:25:32
オリジナル
1508 人が閲覧しました

イテレーターは、シーケンス型データ構造のトラバース動作をトラバースされるオブジェクトから分離できるパターンです。次に、Power Node Java Academy によってコンパイルされた Java イテレーターについて説明します。これは、シーケンス タイプのデータ構造のトラバース動作をトラバースされるオブジェクトから分離できるパターンです。つまり、シーケンスの基礎となる構造がどのようなものであるかを気にする必要はありません。このオブジェクトを取得している限り、イテレータを使用してこのオブジェクトの内部をトラバースできます。

1.IteratorJava は特殊なイテレータを提供します <>Iterator をシーケンスで実装できます。このインターフェイスは、標準の Java イテレータを提供します。

Iteratorインターフェース

実装後の機能はイテレーターを「使う」ことです

ドキュメント定義:

Package java.util;
 publicinterface Iterator<E> {
 boolean hasNext();//判断是否存在下一个对象元素
 E next();
 void remove();
 }
 Package java.util;  
 public interface Iterator<E> { 
   boolean hasNext();//判断是否存在下一个对象元素 
   E next(); 
   void remove(); 
 }
ログイン後にコピー

2. IterableJavaにはIterableインターフェースも用意されており、Iterableインターフェース以降の関数はこのインターフェイスを実装する一般的に使用されるサブインターフェイスは、Collection、Deque

List

、QueueSetです。このインターフェースの iterator() メソッドは、標準の Iterator 実装を返します。このインターフェースを実装すると、オブジェクトを Foreach ステートメントのターゲットにすることができます。 Foreach 構文を使用して、基になるシーケンスをトラバースできます。
Iterable インターフェイスには、Iterator を生成できる iterator() メソッドが含まれており、Iterable インターフェイスはシーケンス内を移動するために foreach によって使用されます。したがって、Iterable インターフェイスを実装するクラスを作成すると、それを foreach ステートメントで使用できます。


ドキュメント定義:

Package java.lang; 
 import java.util.Iterator;
 public interface Iterable<T> {
 Iterator<T> iterator();
 }
ログイン後にコピー

ドキュメント定義:

 Package java.lang;   
 import java.util.Iterator;  
 public interface Iterable<T> {  
   Iterator<T> iterator();  
 }
ログイン後にコピー

Iteratorの簡単な使用例

 import java.util.*; 
 publicclass TestIterator { 
 public static void main(String[] args) {
 List list=new ArrayList(); 
 Map map=new HashMap(); 
 for(int i=0;i<10;i++){ 
 list.add(new String("list"+i) ); 
 map.put(i, new String("map"+i)); 
 } 
 Iterator iterList= list.iterator();//List接口实现了Iterable接口 
 while(iterList.hasNext()){ 
 String strList=(String)iterList.next(); 
 System.out.println(strList.toString()); 
 } 
 Iterator iterMap=map.entrySet().iterator(); 
 while(iterMap.hasNext()){ 
 Map.Entry strMap=(Map.Entry)iterMap.next(); 
 System.out.println(strMap.getValue());
 }
 }
 }
ログイン後にコピー

Iteratorの簡単な使用例

import java.util.*;   
 public class TestIterator {   
  public static void main(String[] args) {   
    List list=new ArrayList();   
    Map map=new HashMap();   
    for(int i=0;i<10;i++){   
     list.add(new String("list"+i) );   
      map.put(i, new String("map"+i));   
    }   
    Iterator iterList= list.iterator();//List接口实现了Iterable接口   
     while(iterList.hasNext()){ 
   String strList=(String)iterList.next();   
      System.out.println(strList.toString());   
    }   
   Iterator iterMap=map.entrySet().iterator();   
    while(iterMap.hasNext()){   
     Map.Entry strMap=(Map.Entry)iterMap.next();   
      System.out.println(strMap.getValue()); 
   
    } 
  } 
 }
ログイン後にコピー

Interface Iteratorは、次のようなさまざまなサブインターフェイスの状況に応じて機能を拡張します。 List と同様 イテレータ ListIterator は、さまざまな List クラスへのアクセスにのみ使用できます。 ListIterator は両方向に移動できます。


3. Iterator とジェネリック Iterator は、そのような Iterator オブジェクトをコレクション クラス内の任意の実装クラスに返すことができます。どのクラスにも応用できます。


コレクションクラスにロードできるオブジェクトの型(List、Setなど)は、コレクションから取り出される時点では、すべて

オブジェクトクラス

の型である必要があるためです。使用するときに強制的に変換されるので非常に面倒です。 ジェネリックスを使用すると、ロードするコレクションの型を事前に決定することができ、型変換を表示せずに直接使用できるようになります。

4. foreach と Iterator の関係 for each は、jdk5.0

に新しい

ループ 構造を追加しました。これを使用して、セットされた添字を考慮せずにコレクション内の各要素を処理できます。 形式は以下の通りです

は、コレクション内の各要素を一時的に格納し、対応するステートメント(ブロック)を実行するための
変数

を定義します。コレクションは、

配列、または変更可能なインターフェースを実装するクラスオブジェクトである必要があります。 上の例ではジェネリックスと forEach を使用しています:

import java.util.*;
 public class TestIterator {  
 public static void main(String[] args) {
 List<String> list=new ArrayList<String> (); 
 for(int i=0;i<10;i++){ 
 list.add(new String("list"+i) ); 
 } 
 for(String str:list){
 System.out.println(str); 
 }
 }
ログイン後にコピー

上の例ではジェネリックスと forEach を使用しています:

import java.util.*; 
 public class TestIterator {  
  public static void main(String[] args) {  
    List<String> list=new ArrayList<String> ();   
    for(int i=0;i<10;i++){ 
      list.add(new String("list"+i) ); 
    } 
    for(String str:list){ 
     System.out.println(str); 
    }  
 }
ログイン後にコピー

for each ループ ステートメントを使用する利点は、より簡潔でエラーが発生しにくいことであることがわかります。 、添え字の開始値と終了値を気にする必要はありません。 forEach はキーワードではなく、キーワードは for であり、ステートメントはイテレータによって実装されます。これらの最大の違いは、remove() メソッドです。一般に、

delete

メソッドと add メソッドは、次のような特定のコレクションのメソッドです。
List list = new ArrayList();
list.add(...); list.remove(...);
ログイン後にコピー

但是,如果在循环的过程中调用集合的remove()方法,就会导致循环出错,因为循环过程中list.size()的大小变化了,就导致了错误。 所以,如果想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。forEach就是为了让用iterator循环访问的形式简单,写起来更方便。当然功能不太全,所以但如有删除操作,还是要用它原来的形式。

4 使用for循环与使用迭代器iterator的对比

采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快

采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快。从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.

而使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.

【相关推荐】

1. Java免费视频教程

2. YMP在线手册

3. JAVA初级入门视频教程

以上がイテレータに関する詳細なチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!