对于“foreach”增强型for循环和集合框架中的“Iterator”想必都不会陌生,今天记录一下关于“迭代器”与“foreach”之间的一些关系。
目录:
- 使用
- 原因&原理
- 应用
使用
使用foreach遍历容器数据的话,只需要写几行代码就ok了
private static void test_2(){
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for(String str : list){
System.out.println(str);
}
}
不知道大家有没有想过,为什么foreach除了可以遍历数组外还可以遍历容器类中的数据元素呢?
接下来就介绍下原因与原理。
原因&原理
- 原因:从jdk1.5开始引入了 Iterable接口,该接口被foreach用来在序列中移动遍历数据。
- 原理:Iterable接口内部只有一个“iterator()”,该方法会返回一个“Iterator”。foreach实质上正是利用Iterator来达到遍历数据元素 的目的。
之所以foreach可以遍历jdk中定义的容器类中的数据是因为这些系统类都实现了Iterable接口。我们来看下集合框架中顶层接口Collection的实现。
原理知道之后,我们来看看如何应用“Iterable,Iterator”通过foreach循环来遍历自定义容器类中的数据吧。
应用
private static void test_1(){
Test<String> test = new Test<>(new String[]{"Hello", "World", "!"});
for(String str : test){
System.out.println(str);
}
}
/**
* 具体的Iterable实现类
*/
private static class Test<T> implements Iterable<T>{
private T[] array;
public Test(T[] array) {
this.array = array;
}
@Override
public Iterator<T> iterator() {
return new TestIterator<>(array);
}
/**
* 自定义迭代器
*/
private static class TestIterator<E> implements Iterator<E>{
private E[] array;
private int index;
public TestIterator(E[] array) {
this.array = array;
}
@Override
public boolean hasNext() {
return this.index < this.array.length;
}
@Override
public E next() {
return this.array[this.index++];
}
}
}
log
Hello
World
!
参考:
《Java编程思想》