一、迭代器的概念 点击此处返回总目录 二、Iterator接口 三、Iterator的实现过程 四、迭代器的并发修改异常 五、增强的for循环 一、迭代器(Iterator)介绍 在java里面有一个接口:Iterator。 java里面有很多集合,每种集合元素存储的方式不一样,取的方式可能也不一样。每一个都学习怎么获取很不现实,这时候就出现了迭代器,把所有的集合都搞成同样的方式获取。迭代器的好处就是,屏蔽掉了各种集合的不同。 Collection集合元素的通用获取方式:取元素之前首先判断集合中有没有元素,如果有,就把元素取出来,如果还有,就继续取出,直到取完。这种取出方式的专业术语就叫迭代。(说白了,就是遍历) 迭代器:获取集合中元素的一种方式。 二、Iterator接口 共有三个抽象方法,我们学习两个: 1. boolean hasNext() //如果仍有元素可以迭代,则返回 true。 2. E next() //获取下一个元素。 因为Iterator是接口,所以应该找他的实现类。 接口Colletion中的iterator()方法,返回的就是在此 collection 的元素上进行迭代的迭代器。 ArrayList是Collection的实现类,重写了iterator对象,返回的是Iterator接口的实现类的对象。 所以通过ArrayList的对象调用iterator()方法,方法的运行结果就是Iterator接口的实现类的对象。可以通过多态的方式接收一下。 这就是面向接口的编程。 例1:Iterator的使用
package cn.itcast.demo05; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Test { public static void main(String[] args) { Collection<String> coll = new ArrayList<String>(); coll.add("aaa"); coll.add("bbb"); Iterator<String> it = coll.iterator(); //多态。调用iterator方法获取Iterator接口的实现类的对象。 while(it.hasNext()){ System.out.println(it.next()); } } } |
例2:Collection<String>中的<String>可以不写,这时集合什么都可以存。如果不写,Iterator<String>中的<String>也不能写。 //Person.java
package cn.itcast.demo05; public class Person { private String name; private int age; public Person(){} public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString(){ return this.name +"--"+this.age; } } |
//Test.java
package cn.itcast.demo05; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Test { public static void main(String[] args) { Collection coll = new ArrayList(); //不写<String>,什么都能存。 coll.add("aaa"); coll.add(new Person("liu",23)); //既可以存字符串,又能存Person对象。 Iterator it = coll.iterator(); //不写<String> while(it.hasNext()){ System.out.println(it.next()); } } } |
运行结果: aaa liu--23 三、Iterator的实现过程 当执行coll.iterator();时,会创建一个指针,指向-1的位置。 当执行it.hasNext()时,会判断指针指的位置有没有下一个元素。 当执行it.next()时,首先把下一个元素取出来,然后指针往后移动一位。只有执行next()时,指针才往后移动。
例如下面的例子: "aaa" "bbb" "ccc" -1 0 1 2 coll.iterator(); //初始化,指针指向-1 it.hasNext(); //有下一个元素("aaa") it.next(); //返回"aaa",指针指向0 it.hasNext(); //有下一个元素("bbb") it.next(); //返回"bbb",指针指向1 it.hasNext(); //有下一个元素("ccc") it.next(); //返回"ccc",指针指向2 it.hasNext(); //没有下一个元素了。 |
四、迭代器的并发修改异常 在使用迭代器进行遍历的时候,不允许修改集合的长度。否则会报:java.util.ConcurrentModificationException。不改长度是指不能进行增删元素的操作,但是可以改元素。 例:对集合元素进行遍历,当发现元素是"bbb"时,添加元素"eee"。下面的程序会报错。
package cn.itcast.demo03; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Test { public static void main(String[] args) { Collection<String> coll = new ArrayList<String>(); coll.add("aaa"); coll.add("bbb"); coll.add("ccc"); Iterator<String> it = coll.iterator(); while(it.hasNext()){ String s = it.next(); if(s.equals("bbb")){ coll.add("eee"); //当使用迭代器遍历的时候,使用了add操作,改变了集合的长度。报错。 } } } } |
五、增强for循环 增强的for循环是jdk1.5新特性。 jdk1.5之后,出现了新的接口java.lang.Iterable,Collection开始继承Iterable。而Iterable接口出现目的就是为了实现增强的for循环。 凡是见到的集合,还有数组,都可以使用增强for循环。 格式: for(数据类型 变量名: 数组或集合){ sop(变量); } 好处:代码少 坏处:只能做遍历用。没有索引,不能操作容器里面的数。 例1:增强for循环使用
package cn.itcast.demo06; public class Test { public static void main(String[] args) { int[] arr = {1,22,3,4,5}; for(int i:arr){ System.out.println(i); } } } |
|
发表评论 取消回复