为了从一个系列中生成连续的元素,我们可以使用java迭代器。这是对枚举界面的改进。迭代器代替了从jdk 1.2开始的枚举
这是一个很好的实用程序集合。每个集合都是独一无二的,并且想象如果我们必须在需要迭代的时候为每个集合写自己的逻辑。相反,java强制一个集合来传递一个迭代器。
这些漂亮的实用程序使java可爱,不是吗?
重要注意事项:
我们只能在一个方向迭代
迭代只能做一次。如果你完成了系列的完成。如果我们需要重新迭代,我们应该得到一个新的迭代器。
没有泛型的迭代器示例
packagecom.javapapers;importjava.util.ArrayList;importjava.util.Iterator;public classExampleIterator {public static voidmain(String args[]){
ArrayList animal= newArrayList();
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,我们需要对其进行类型转换。
使用泛型的迭代器示例
packagecom.javapapers;importjava.util.ArrayList;public classExampleIterator {public static voidmain(String args[]){
ArrayList animal= newArrayList();
animal.add("Horse");
animal.add("Lion");
animal.add("Tiger");for(String animalObj : animal) {
System.out.println(animalObj);
}
}
}
输出:
Horse
Lion
Tiger
看起来很简单由于我们正在使用各种泛型,所以没有明确地引用迭代器。
可迭代和迭代器
为了使对象可以迭代,它需要发出一个Iterator对象。要执行此合同,将使用Iterator接口。它包含一个名为iterator()的方法,它返回Iterator。因此,任何实现Iterable的类都将返回一个Iterator。
public interface Collection extends Iterable {
例如采取任何集合。集合是表示一系列元素的容器的接口。每个集合像ArrayList,Vector都实现了Collection等等迭代器。
Iterable的一个优点是,当您实现Iterable时,那些对象获得了以下支持:每个循环语法。
使用迭代器删除元素
迭代器有一个删除方法,我们可以从底层对象中删除元素。
它删除迭代器返回的最后一个元素。
迭代器和枚举接口之间的区别
在迭代器中引入了remove()方法。使用这种方法,我们可以从我们正在迭代的底层集合中删除元素。
枚举有两种方法,两种都可以在迭代器中使用。两者的方法名称缩短。
ListIterator是一个更好的迭代器,它包含更多的实用方法,如获取元素索引和向基础对象添加元素。使用ListIterator,我们可以在两个方向进行迭代。
ConcurrentModificationException的
看下面的代码,它会引发ConcurrentModificationException。当我们使用迭代器时,我们无法添加或移除元素到底层集合。
packagecom.javapapers;importjava.util.ArrayList;public classExampleIterator {public static voidmain(String args[]){
ArrayList animal= newArrayList();
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,以便返回一个迭代器,我们可以使用它迭代元素。
packagecom.javapapers;importjava.util.ArrayList;importjava.util.Iterator;public class AnimalIterator implements Iterator{private ArrayList>animal;private intposition;publicAnimalIterator(Animal animalBase) {this.animal =animalBase.getAnimal();
}
@Overridepublic booleanhasNext() {if (position
return false;
}
@OverridepublicObject next() {
Object aniObj=animal.get(position);
position++;returnaniObj;
}
@Overridepublic voidremove() {
animal.remove(position);
}
}
packagecom.javapapers;importjava.util.ArrayList;importjava.util.Iterator;public class Animal implements Iterable{private ArrayList animal = new ArrayList();publicAnimal(ArrayList animal){this.animal =animal;
}publicArrayList getAnimal() {returnanimal;
}
@Overridepublic Iteratoriterator() {return new AnimalIterator(this);
}
}
packagecom.javapapers;importjava.util.ArrayList;public classTestIterator {public static voidmain(String args[]) {
ArrayList animalList = newArrayList();
animalList.add("Horse");
animalList.add("Lion");
animalList.add("Tiger");
Animal animal= newAnimal(animalList);for(String animalObj : animal) {
System.out.println(animalObj);
}
}
}
Output:
Horse
Lion
Tiger