引言
我们知道foreach语句是可以遍历数组和集合对象,而且foreach语句是for语句特殊情况下得简化版,任何能使用foreach的情况下都能改写成for语句的形式,但是,foreach的底层实现是什么样子的?下面一一详细说明。foreach遍历集合
foreach可以遍历LIst,Set等继承Collection的对象,一下是简单的例子。public class Example { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); //[1,2,3,4,5] Set<Integer> set = new HashSet<>(); //[1,2,3,4,5] for (Integer i : list){ System.out.println(i); } for (Integer i : set){ System.out.println(i); } } }
这里有一个List和Set,假设里面都存储5个对象[1,2,3,4,5]。foreach可以遍历其中的元素并依次输出。以下是编译后的内容
public static void main(String[] args) { ArrayList list = new ArrayList(); HashSet set = new HashSet(); Iterator var10 = list.iterator(); Integer var11; while(var10.hasNext()) { var11 = (Integer)var10.next(); System.out.println(var11); } var10 = set.iterator(); while(var10.hasNext()) { var11 = (Integer)var10.next(); System.out.println(var11); } }
这里可以清楚的看到,编译器会先获得集合的iterator对象的实例, 然后根据泛型声明一个指定对象类型的对象,然后进行while循环,使用iterator的hasNext方法和next方法进行取值。
这就是foreach遍历集合对象的底层实现
foreach遍历数组对象
我们知道,数组是没有实现Iterable接口的,所以foreach遍历数组对象时底层会怎么处理呢?我们看下面的例子public class Example { public static void main(String[] args) { int[] array = new int[]{1,2,3,4,5,6,7}; for (Integer i : array){ System.out.println(i); } } }
这里初始化数组时放入了数字1-7,然后循环遍历打印,编译后的内容如下
public static void main(String[] args) { int[] array = new int[]{1, 2, 3, 4, 5, 6, 7}; int[] var2 = array; int var3 = array.length; for(int var4 = 0; var4 < var3; ++var4) { Integer i = Integer.valueOf(var2[var4]); System.out.println(i); } }
很容易的看出来,数组的遍历是通过基本的for()循环来实现的,具体内容不再赘述
总结
两个简单的例子说明了foreach遍历集合类型和数组类型底层实现的不同- 集合类型的遍历本质是使用迭代器实现的
- 数组的遍历是通过for循环来实现的
所以可以扩展到Map类型的遍历,本质也是了集合遍历一致,通过迭代器来遍历所有的key或者value
如有不正确的地方,还希望大家及时指正