关于Foreach的简单理解

foreach是java中循环的一种,用于便利数组或者集合中的元素。for循环用于遍历数组的时候需要预先知道数组的大小。而foreach和iterator便利集合时不需要知道数组或者集合的大小。

一般来说,我们遍历已知类型数组的话一般采用foreach循环的形式。而我很久之前听过一个前辈说过,如果集合为空的话那么运行时将会报空指针的错误,今天来验证一下。

首先建立一个空的数组,利用foreach循环遍历下

关于Foreach的简单理解

关于Foreach的简单理解

结果是能运行成功,并没有报空指针的异常。

接下来测试下list为空指针时

关于Foreach的简单理解

关于Foreach的简单理解

结果会报空指针异常。通过这个结果我们进一步debug一下,发现如果是空list的话,是不会进入foreach循环的内部的。而如果是空指针的话,在foreach判断阶段则报了异常。

接下来我们测试下iterator迭代器。

关于Foreach的简单理解

关于Foreach的简单理解

可以看出,在空数组的情况下,iterator迭代其是不会报错的。那么空指针的情况下呢

关于Foreach的简单理解

关于Foreach的简单理解

抛出了空指针异常,而且抛出的异常是在标注的位置。既然这样,那么foreach和iterator是不是有什么内在的关联呢。我查询了list的父类Collection,发现它继承了Iterable类

关于Foreach的简单理解

而Iterable类里面有定义iterator对象。foreach其实也是通过iterator而实现的,故和iterator具有相同的性质。

关于Foreach的简单理解

那么问题来了,我们什么情况下改用foreach,什么情况下用iterator呢。通过资料查询,得知iterator是不需要判断集合的类型的,所以我们在不知道集合类型的情况下完全可以用iterator来实现。但是foreach就不行了

关于Foreach的简单理解

关于Foreach的简单理解

这样我们可以处理我们不知道类型的集合遍历。接下来我们进行一下效率的对比。选取100000000个元素的数组,分别用list和iterator进行循环遍历

首先是iterator

关于Foreach的简单理解

关于Foreach的简单理解

总耗时15

接下来是foreach

关于Foreach的简单理解

关于Foreach的简单理解

总好是146.可见效率天差地别