Java简单迭代器实例源码。一直好奇Foreach的语法,想ArrayList和HashMap,为什么foreach就可以遍历呢,今天自己做了一个简单的实现。
public class SimpleForeach<T> implements Iterable<T>, Iterator<T>{
private T[] t;
/**
* 迭代的游标值,-1表示迭代未开始。
*/
private int index = -1;
private int size;
public SimpleForeach(T[] t) {
this.t = t;
this.size = t.length;
}
@Override
public Iterator<T> iterator() {
return this;
}
/**
* Foreach首先调用这个方法,判断迭代是否已经结束。
*/
@Override
public boolean hasNext() {
boolean flag = index < size – 1;
if (index == size -1) {
index = -1;
}
return flag;
}
/**
* Foreach游标移动以及获取迭代值的逻辑方法
*/
@Override
public T next() {
if (index < size – 1) {
index++;
return t[index];
}
return null;
}
@Override
public void remove() {
for (int i = size – 1; i >= 0; i–) {
if (t[i] != null) {
t[i] = null;
return;
}
}
}
}
测试方法如下:
@Test
public void testSimpleForeach() {
String[] strs = {“1″, “2″, “3″, “4″, “5″};
SimpleForeach<String> foreach = new SimpleForeach<String>(strs);
for (String str : foreach) {
System.out.println(str);
}
for (String str : foreach) {
System.out.println(str);
}
}
在iterator(),hasNext()和next()这三个方法打上断点,可以清楚的知道迭代的过程。
首先进入iterator()方法,获得迭代器。跟着进入hasNext()方法,判断迭代时候已经到数组的末端。
next()方法则处理游标的移动,迭代值的计算和返回。
至于为什么会按照这样的逻辑走,那主要是因为Java编译器,编译器或将Foreach语法编译成如上所说的代码,最后运行时就Foreach语法就生效了。