为了从一个系列中生成连续的元素,我们可以使用java迭代器。这是对枚举界面的改进。迭代器代替了 [从jdk 1.2开始]的枚举这是一个很好的实用程序集合。
每个集合都是独一无二的,并且想象如果我们必须在需要迭代的时候为每个集合写自己的逻辑。相反,java强制一个集合来传递一个迭代器。这些漂亮的实用程序使java可爱,不是吗?
重要注意事项:
- 我们只能在一个方向迭代
- 迭代只能做一次。
没有泛型的迭代器示例
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,我们需要对其进行类型转换。
使用泛型的迭代器示例
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
Tiger
看起来很简单 由于我们正在使用各种泛型,所以没有明确地引用迭代器。
可迭代和迭代器
为了使对象可以迭代,它需要发出一个Iterator对象。要执行此合同,将使用Iterator接口。它包含一个名为iterator()的方法,它返回Iterator。因此,任何实现Iterable的类都将返回一个Iterator。
public interface Collection <E> extends Iterable <E> {
例如采取任何集合。集合是表示一系列元素的容器的接口。每个集合像ArrayList,Vector都实现了Collection等等迭代器。
- Iterable的一个优点是,当您实现Iterable时,那些对象获得了以下支持:每个循环语法。
使用迭代器删除元素
- 迭代器有一个删除方法,我们可以从底层对象中删除元素。
- 它删除迭代器返回的最后一个元素。
迭代器和枚举接口之间的区别
1.在迭代器中引入了remove()方法。使用这种方法,我们可以从我们正在迭代的底层集合中删除元素。
2.枚举有两种方法,两种都可以在迭代器中使用。两者的方法名称缩短。
ListIterator是一个更好的迭代器,它包含更多的实用方法,如获取元素索引和向基础对象添加元素。使用ListIterator,我们可以在两个方向进行迭代。
ConcurrentModificationException的
看下面的代码,它会引发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:
Horse
Lion
Tiger