刚开始学习增强for循环时,感觉很方便,无论是数组还是集合类都可以实现遍历,前提是你不需要用到数组下标。但也很疑惑他是如何做到的呢?原来foreach底层的实现就是java迭代器Iterator.
想要使用迭代器遍历,首先要实现Iterable接口,iterable接口定义了iterator()方法.iterator()方法会返回实现Iterator接口的类.
//Iterable接口定义
public interface Iterable<T> {
Iterator<T> iterator();//返回了Iterator<T>.
}
//Iterator接口定义
public interface Iterator<E> {
//是否有下一个
boolean hasNext();
//返回下一个对象
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
我们来看一下集合类是否实现了
我们再看一下ArrayList的具体实现
我们来使用最简单的迭代器,这就很好理解了.
List<String> list = new ArrayList();
list.add("a");
list.add("b");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
下面来看foreach循环遍历:
for (String s:list) {
System.out.println(s);
}
也可以做到相同的效果.输出都是a,b我们用IDEA打开编译后的.class文件
List<String> list = new ArrayList();
list.add("a");
list.add("b");
//这是foreach编译后的文件,还是转换成了迭代器
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
String s = (String)iterator.next();
System.out.println(s);
}