ホームページ  >  記事  >  Java  >  イテレータ、拡張された、一般的な使用法のコレクション

イテレータ、拡張された、一般的な使用法のコレクション

巴扎黑
巴扎黑オリジナル
2017-06-26 11:32:511378ブラウズ

java.util.Collection インターフェース
はコレクションの共通メソッドを定義するコレクションのトップレベルのインターフェースです。
このインターフェースはオブジェクトを直接作成できません。
Collection<コレクション内のデータ型を使用します。 (generic)> coll = new ArrayList<コレクション内のデータ型(generic)>();

Iterator
コレクションへのデータの格納方法(データ型)と削除方法が異なります。コレクション内の要素も異なります。java は、イテレーターと呼ばれる要素を抽出するパブリックな方法を提供します
イテレーターを記述するインターフェイス: java.util.Iterator

インターフェイスの抽象メソッド:
boolean hasNext()反復可能な静止要素の場合は true を返します。 コレクションに要素があるかどうかを判断し、要素がない場合は true を返し、ない場合は false を返します
E next() 反復の次の要素を返します。 コレクション内の次の要素を取り出します

イテレータはインターフェースです。イテレータの実装クラスは各コレクションの内部クラスです
Collection インターフェースには次のメソッドがあります。 iterator メソッドは反復を返します。 Iterator
Iterator iterator() このコレクションの要素に対する反復子を返します。
ArrayList コレクションは Collection インターフェースを実装し、イテレーター メソッドをオーバーライドします。

メソッドの戻り値は、イテレーターの実装クラスを返すことだけを知っておく必要があります。この方法はインターフェイス指向プログラミングと呼ばれます

1. コレクション オブジェクトを作成し、コレクションに要素を追加します 2. を使用します。コレクション内の iterator メソッドを使用してイテレータを取得します。 実装クラス オブジェクトは、Iterator インターフェイスを使用して (ポリモーフィックに) 受け取ります 3. イテレータ内の hasNext メソッドと next メソッドを使用して、コレクション内の要素を反復処理して取り出します

 1 public static void main(String[] args) { 2         //1.创建集合对象,往集合中添加元素 3         //Collection<String> coll = new ArrayList<String>(); 4         Collection<String> coll = new HashSet<String>(); 5         coll.add("姚明"); 6         coll.add("乔丹"); 7         coll.add("詹姆斯"); 8         coll.add("科比"); 9         coll.add("艾弗森");10         //2.使用集合中的方法iterator获取迭代器的实现类对象,使用Iterator接口接收(多态)11         //集合中的数据类型是什么,迭代器的数据类型就是什么,跟着集合走12         Iterator<String> it = coll.iterator();13         //3.使用iterator中的方法hasNext和next方法进行迭代,取出集合中的元素14         //boolean hasNext() 如果仍有元素可以迭代,则返回 true。15         /*boolean b = it.hasNext();16         System.out.println(b);17         //E(String) next() 返回迭代的下一个元素。18         String s = it.next();19         System.out.println(s);20         21         b = it.hasNext();22         System.out.println(b);23         s = it.next();24         System.out.println(s);25         26         b = it.hasNext();27         System.out.println(b);28         s = it.next();29         System.out.println(s);30         31         b = it.hasNext();32         System.out.println(b);33         s = it.next();34         System.out.println(s);35         36         b = it.hasNext();37         System.out.println(b);38         s = it.next();39         System.out.println(s);40         41         b = it.hasNext();42         System.out.println(b);//false,没有元素了43         s = it.next();//没有元素了,在取就报NoSuchElementException没有元素异常44         System.out.println(s);*/45         46         /*47          * 发现以上迭代的过程是一个重复的过程,可以使用循环优化48          * 我们不知道集合中有多少元素,所以可以使用while循环49          * while循环的结束条件:hasNext();返回false50          */51         while(it.hasNext()){52             String s = it.next();53             System.out.println(s);54         }55         System.out.println("-------------------");56         /*57          * for循环方式迭代器,使用不多58          */59         /*for(Iterator<String> it2 = coll.iterator();it2.hasNext();){60             String s = it2.next();//取出元素,移动指针到下一位61             System.out.println(s);62         }*/63     }


同時変更例外
反復プロセス中に、コレクションの長さが変更されると、同時変更例外が発生します

走査プロセス中に、コレクションの長さが変更されますが、反復子はそれを認識せず、 ConcurrentModificationException が発生します
解決策:

1. Iteration は Iterate です。コレクションを変更しないでください
2. Iterator のサブインターフェイス ListIterator で add/remove メソッドを使用して、反復子自体が要素に要素を追加/削除できるようにしますコレクションから このようにして、反復子自体がコレクション内の変更を認識します。同時変更例外は発生しません。
void add(E e) 指定された要素をリストに挿入します (オプションの操作)。
void Remove() next またはPrevious によって返された最後の要素をリストから削除します (オプションの操作)。

 1  public static void main(String[] args) { 2         ArrayList<String> list = new ArrayList<String>(); 3          4         list.add(null); 5         list.add("abc1"); 6         list.add("abc2"); 7         list.add("abc3"); 8         list.add("abc4"); 9         10         /*11          * 使用迭代器遍历集合12          */13         //获取迭代器14         Iterator<String> it = list.iterator();15         //使用while遍历集合16         while(it.hasNext()){17             String s = it.next();18             19             /*20              * 判断集合中有没有"abc3"这个元素21              * 如果有,增加一个元素"itcast"22              * 编程技巧:使用equals判断的时候,要把已知的变量写在前边,未知的写在后边,防止空指针异常23              */24             //if(s.equals("abc3")){25             if("abc3".equals(s)){26                 //1.迭代就是迭代,不要对集合进行修改27                 //list.add("itcast");28             }29             30             System.out.println(s);31         }32         33         System.out.println("------------------");34         35         /*36          * 2.使用迭代器Iterator的子接口ListIterator中的方法add/remove,让迭代器自己增加往集合中增加元素/移除元素37          */38         ListIterator<String> listIt = list.listIterator();39         while(listIt.hasNext()){40             String s = listIt.next();41             if("abc3".equals(s)){42                 listIt.add("itcast");43             }44             System.out.println(s);45         }46         System.out.println(list);47     }


拡張 for
内部には反復コードがあり、反復コードが簡素化され、トラバースが容易になります

Collection インターフェースは Iterable を継承するため、Collection インターフェースのすべての実装クラスは拡張 for を使用できます
注: 拡張 forはJDK1.5以降に登場した


形式です:

for (データ型(コレクション/配列のデータ型) 変数名:コレクション名/配列名) {
syso (変数名); }

ジェネリックスJava の

はデータ型であり、オブジェクトの作成時に決定されます

Java のジェネリックは擬似ジェネリックです: コンパイル時 (.java でコードを書く)、実行時 (.class) いいえ 乱数: 擬似乱数


ジェネリックの利点:

1. 強制転送を回避し、要素固有のメソッドを直接使用できます
2. 実行時例外をコンパイル時例外 (コンパイル失敗) に変換します ジェネリックを使用してクラスを定義します
ArrayList を模倣しますcollection
public class ArrayList{}
E: 不明なデータ型です。おそらく Integer、おそらく String、おそらく Person
クラス オブジェクトを作成するときにデータ型を決定します

定義形式:
修飾子クラス クラス名
}

 1 public class GenericClass<E> { 2     private E name; 3  4     public E getName() { 5         return name; 6     } 7  8     public void setName(E name) { 9         this.name = name;10     }11     12     public void method(E e){13         System.out.println(e);14     }


ジェネリックを含むインターフェースを定義します
形式:

修飾子インターフェースインターフェース名{ Abstract Method ( Parameters ); }

1  public interface GenericInterface<E> {2     public abstract void method(E e);3 }


rrreええ
ジェネリックメソッドを含む
クラスで定義されたジェネリックではなく、メソッド自体によって定義されたジェネリックです

定義形式: 修飾子内で、修飾子<を使用するには、戻り値の型の間にジェネリックを定義する必要があります。 generic> 戻り値の型 メソッド名 (パラメータ ) { }
メソッドのジェネリックス データ型、渡されるデータの型、およびジェネリックの型を決定します (何も関係ありません)クラスのジェネリックスを使用してください)

 1 /* 2  * 1.定义接口的实现类,不管泛型,接口泛型是怎么写的,实现类也怎么写 3  *  public class ArrayList<E> implements List<E>{} 4  *  创建实现类对象的时候确定泛型的数据类型 5  */ 6 class GenericInterfaceImpl1<E> implements GenericInterface<E>{ 7  8     @Override 9     public void method(E e) {10         System.out.println(e);11     }12 }

泛型的通配符:?,代表任意的数据类型

上限限定:? extends E代表只要是E类型的子类即可
下限限定:? super E代表只要是E类型的父类即可

ArrayList集合的构造方法
ArrayList(Collection c)
参数是一个集合,集合的数据类型有要求,只能是ArrayList泛型的子类或者是本身

ArrayList(Collection c)
参数是一个集合,集合的数据类型有要求,只能是ArrayList泛型的子类或者是本身

 1 /* 2  * 斗地主案例: 3  * 1.准备牌 4  * 2.洗牌 5  * 3.发牌 6  * 4.看牌 7  */ 8 public class DouDiZhu { 9     public static void main(String[] args) {10         //1.准备牌11         //创建存储54张牌的集合12         ArrayList<String> poker = new ArrayList<String>();13         //存储大王小王14         poker.add("大王");15         poker.add("小王");16         //存储52张牌17         //创建序号的数组18         String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};19         //创建花色数组20         String[] colors = {"?","?","?","?"};21         //嵌套遍历两个数组22         for (String number : numbers) {23             for (String color : colors) {24                 //System.out.println(color+number);25                 //把组合的牌放入到集合中26                 poker.add(color+number);27             }28         }29         //System.out.println(poker);30         31         /*32          * 2.洗牌33          * 使用Collections中的方法34          * static void shuffle(List<?> list)  
35          */36         Collections.shuffle(poker);37         //System.out.println(poker);38         39         /*40          * 3.发牌41          * 创建4个集合42          * 遍历poker集合43          * 使用poker集合的索引%3发牌44          */45         ArrayList<String> player01 = new ArrayList<String>();46         ArrayList<String> player02 = new ArrayList<String>();47         ArrayList<String> player03 = new ArrayList<String>();48         ArrayList<String> diPai = new ArrayList<String>();49         //遍历poker集合50         for (int i = 0; i < poker.size(); i++) {51             //获取牌52             String s = poker.get(i);53             //先判断索引是否为底牌的索引 51 52 5354             if(i >=51){55                 //给底牌发牌56                 diPai.add(s);57             }else if(i%3==0){58                 //给玩家1发牌59                 player01.add(s);60             }else if(i%3==1){61                 //给玩家1发牌62                 player02.add(s);63             }else if(i%3==2){64                 //给玩家1发牌65                 player03.add(s);66             }67         }68         //4.看牌69         System.out.println("刘德华:"+player01);70         System.out.println("周润发:"+player02);71         System.out.println("周星驰:"+player03);72         System.out.println("底牌:"+diPai);73     }74 }

 

以上がイテレータ、拡張された、一般的な使用法のコレクションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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