爲了從一個系列中生成連續的元素,咱們可使用java迭代器。這是對枚舉界面的改進。迭代器代替了從jdk 1.2開始的枚舉html
這是一個很好的實用程序集合。每一個集合都是獨一無二的,而且想象若是咱們必須在須要迭代的時候爲每一個集合寫本身的邏輯。相反,java強制一個集合來傳遞一個迭代器。java
這些漂亮的實用程序使java可愛,不是嗎?api
重要注意事項:oracle
package com.javapapers; import java.util.ArrayList; import java.util.Iterator; public class ExampleIterator { public static void main(String args[]){ ArrayList animal = new ArrayList(); animal.add("Horse"); animal.add("Lion"); animal.add("Tiger"); Iterator animalItr = animal.iterator(); while(animalItr.hasNext()) { String animalObj = (String)animalItr.next(); System.out.println(animalObj); } } }
沒有泛型,Iterator返回Object,咱們須要對其進行類型轉換。ide
package com.javapapers; import java.util.ArrayList; public class ExampleIterator { public static void main(String args[]){ ArrayList animal = new ArrayList(); animal.add("Horse"); animal.add("Lion"); animal.add("Tiger"); for(String animalObj : animal) { System.out.println(animalObj); } } }
輸出:
Horse
Lion
Tigerthis
看起來很簡單 因爲咱們正在使用各類泛型,因此沒有明確地引用迭代器。spa
爲了使對象能夠迭代,它須要發出一個Iterator對象。要執行此合同,將使用Iterator接口。它包含一個名爲iterator()的方法,它返回Iterator。所以,任何實現Iterable的類都將返回一個Iterator。code
public interface Collection <E> extends Iterable <E> {
例如採起任何集合。集合是表示一系列元素的容器的接口。每一個集合像ArrayList,Vector都實現了Collection等等迭代器。htm
ListIterator是一個更好的迭代器,它包含更多的實用方法,如獲取元素索引和向基礎對象添加元素。使用ListIterator,咱們能夠在兩個方向進行迭代。對象
看下面的代碼,它會引起ConcurrentModificationException。當咱們使用迭代器時,咱們沒法添加或移除元素到底層集合。
package com.javapapers; import java.util.ArrayList; public class ExampleIterator { public static void main(String args[]){ ArrayList animal = new ArrayList(); animal.add("Horse"); animal.add("Lion"); animal.add("Tiger"); for(String animalObj : animal) { System.out.println(animalObj); animal.add("Hyena"); } } } Output: Horse Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at com.javapapers.ExampleIterator.main(ExampleIterator.java:13)
咱們將建立本身的自定義類,並使其實現Iterable,以便返回一個迭代器,咱們可使用它迭代元素。
package com.javapapers; import java.util.ArrayList; import java.util.Iterator; public class AnimalIterator<String> implements Iterator<Object> { private ArrayList<?> animal; private int position; public AnimalIterator(Animal animalBase) { this.animal = animalBase.getAnimal(); } @Override public boolean hasNext() { if (position < animal.size()) return true; else return false; } @Override public Object next() { Object aniObj = animal.get(position); position++; return aniObj; } @Override public void remove() { animal.remove(position); } }
package com.javapapers; import java.util.ArrayList; import java.util.Iterator; public class Animal implements Iterable<String> { private ArrayList<String> animal = new ArrayList<String>(); public Animal(ArrayList animal){ this.animal = animal; } public ArrayList getAnimal() { return animal; } @Override public Iterator<String> iterator() { return new AnimalIterator(this); } }
package com.javapapers; import java.util.ArrayList; public class TestIterator { public static void main(String args[]) { ArrayList<String> animalList = new ArrayList(); animalList.add("Horse"); animalList.add("Lion"); animalList.add("Tiger"); Animal animal = new Animal(animalList); for (String animalObj : animal) { System.out.println(animalObj); } } }
Output:HorseLionTiger