迭代器
Iterator对象称为迭代器,主要用于遍历Collection集合中的元素
所有实现了Collection接口的集合类都有一个Iterator()方法,用以返回一个实现了iterator接口的对下个,即可以返回一个迭代器。
Iterator的结构
Iterator仅用于遍历集合,Iterator本身并不存放对象。
迭代器执行原理
1 2 3 4 5 6 7 8 public interface Inerator <E>{ boolean hasNext () ; E next () ; void remove () ; }
迭代器的删除操作与Collection的remove方法其实效率快很多,当我们一个集合中拥有213456,我们要删除其中的偶数,结果应该为135,如果调用collection方法,每一次删除之前都要重新遍历,事件开销比较大,但是如果使用迭代器的remove方法,效率会快很多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package 其他;import java.util.Iterator;import java.util.LinkedList;import java.util.List;public class IteratorTest { public static void main (String[] args) { LinkedList<Integer> list=new LinkedList <>(); list.add(2 ); list.add(1 ); list.add(3 ); list.add(5 ); IteratorTest iteratorTest=new IteratorTest (); iteratorTest.removeEvenVer(list); } public void removeEvenVer (List<Integer> list) { Iterator<Integer> integerIterator= list.iterator(); while (integerIterator.hasNext()){ if (integerIterator.next()%2 ==0 ){ integerIterator.remove(); } } } }
这时有的小伙伴会说我们使用增强for循环,不一样可以实现这个吗
1 2 3 4 5 6 7 public void remove (List<Integer> list) { for (Integer i:list){ if (i%2 ==0 ){ list.remove(i); } } }
但是我们要注意,增强for循环所带来的弊端,增强for循环底层的实现基础迭代器,但是在这个过程中modcount与expectedModCount不同步导致的,在最后的判断中抛出异常,在进行删除添加等操作的时候,尽量不要使用增强for循环。
Java ConcurrentModificationException异常原因和解决方法 - Matrix海子 - 博客园 (cnblogs.com)
Iterator iterator=coll.iterator();//得到一个集合的迭代器
//hasNext()判断是否还有下一个元素
//next()指针向下启动,将下移以后集合位置上的元素返回,所以调用next方法之前,则应该先调用hasNext方法来判断是否已经结束,否则可能会发生异常。
我们运行以下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class Test { public static void main (String [] args) { Collection col= new ArrayList (); col.add(123 ); col.add(56 ); col.add("jack" ); col.add(10 ); Iterator iterator=col.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } System.out.println("遍历完毕" ); iterator= col.iterator(); } }
注意:当我们while循环结束后,这时的迭代器已经指向最后的元素,如果我们再一次输出,就会发生报错。若我们想要在同一次运行中再一次遍历这个集合,则需要重置我们的迭代器 。
增强for循环遍历 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import java.util.ArrayList;import java.util.Collection;public class Test { public static void main (String [] args) { Collection col= new ArrayList (); col.add(123 ); col.add(56 ); col.add("jack" ); col.add(10 ); for (Object a:col){ System.out.println(a); } } }
注意,虽然还是for循环,但是本质还是利用了迭代器,利用debug的方法可以进入,是简化版本的die’dai’qi
练习1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class Test { public static void main (String [] args) { Dog dog1=new Dog ("ahhua" ,12 ); Dog dog2=new Dog ("a" ,15 ); Dog dog3=new Dog ("ah" ,13 ); Collection collection=new ArrayList (); collection.add(dog1); collection.add(dog2); collection.add(dog3); Iterator iterator=collection.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } iterator=collection.iterator(); for (Object a:collection){ System.out.println(a); } } } class Dog { private String name; private int age; public Dog (String name, int age) { this .name = name; this .age = age; } @Override public String toString () { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}' ; } }