对于一组数据而言,数据存储的形式有很多种,按照一般的思维而言,不同的数据存储形式有不同的读取的方法,但是在实际应用当中,我们使用数据的方式如果有很多种,就会造成灾难,因此,需要一个统一的方式对数据进行处理,提供统一的接口个使用者去使用,这就是迭代器模式
什么是迭代器——其实就是不管是什么容器(存储数据的方式)提供统一的下一个元素,然后告诉你所有的元素是否都被访问过~
然后我们来看一下封装的类
package cn.csdn.iterator;
/**
* 迭代模式的实现
*/
import java.util.Iterator;
public class IteratorTest implements Iterable<String>{
public String[] str;
public static int i=0;
//这是一个构造方法,用来初始化数据
public IteratorTest(String[] str) {
this.str=str;
}
//这个是实现接口
public Iterator<String> iterator() {
//这里通过匿名内部类的形式返回一个迭代器,所以要new一个迭代器
return new Iterator<String>(){
//这是判断是否还有下一个元素
public boolean hasNext() {
return i<str.length;
}
//这是找到下一个元素
public String next() {
return str[i++];
}
};
}
}
然后看一下使用者的代码
package cn.csdn.iterator;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
//这是一个String类型的数组
String[] str;
//String 类型转化
String s="it is a code .";
str=s.split(" ");
IteratorTest myMsg=new IteratorTest(str);
Iterator<String> iterator=myMsg.iterator();
while(iterator.hasNext()) {
String nextDate=iterator.next();
System.out.println(nextDate);
}
System.out.println("++++++++++++++++++++++");
//这里对比一下传统模式
for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
}
}
这里说明一下
E---->泛型
原因说明:
Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了能更好地理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程,如下图所示
图中,在调用Iterator的next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next()方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next()方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext()方法返回false,表示到达了集合的末尾,终止对元素的遍历。
需要特别说明的是,当通过迭代器获取ArrayList集合中的元素时,都会将这些元素当做Object类型来看待,如果想得到特定类型的元素,则需要进行强制类型转换。
加强for循环遍历元素
虽然Iterator可以用来遍历集合中的元素,但写法上比较繁琐,为了简化书写,从JDK5.0开始,提供了foreach循环。foreach循环是一种更加简洁的for循环,也称增强for循环。foreach循环用于遍历数组或集合中的元素,其具体语法格式如下
for(容器中元素类型 临时变量:容器变量 ){
执行语句
}
package cn.csdn.listdemo;
import java.util.ArrayList;
public class ForeachDemo {
public static void main(String[] args) {
//获取对象
ArrayList<String> list=new ArrayList<String>();
//增加元素
list.add("aaa");
list.add("bbb");
list.add("ccc");
//用增强for循环来遍历元素
/**
* 增强for循环其实就是应用了迭代器原理来的,格式如下:
* for (容器元素类型+变量 : 容器变量) {
执行语句
}
*/
for (String string : list) {
System.out.println(string);
}
}
}