为了从一个系列中生成连续的元素,我们可以使用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时,那些对象获得了以下支持:每个循环语法。
使用迭代器删除元素
- 迭代器有一个删除方法,我们可以从底层对象中删除元素。
- 它删除迭代器返回的最后一个元素。
迭代器和枚举接口之间的区别
- 在迭代器中引入了remove()方法。使用这种方法,我们可以从我们正在迭代的底层集合中删除元素。
- 枚举有两种方法,两种都可以在迭代器中使用。两者的方法名称缩短。
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