优秀的编程知识分享平台

网站首页 > 技术文章 正文

【java】foreach原理(java中的foreach的实现)

nanyue 2024-08-16 00:31:31 技术文章 239 ℃

【地震高岗,一派西山千古秀】

foreach语法最终被编译器转为了对Iterator.next()的调用

List<String> arrList = new ArrayList<>();
        arrList.add("1");
        arrList.add("2");
        arrList.add("3");
        for(String ag:arrList){
            System.out.println(ag);
        };
        for (Iterator<String> iterat = arrList.iterator(); iterat.hasNext();){
            System.out.println(iterat.next());
        }
       forEach像 for一样循环遍历数组,是用下标遍历来实现
        for (int i = 0; i < arr.length; i++) { 
            type var = arr[i];
            body-of-loop
        }
复制代码

1、ArrayList之所以能使用foreach循环遍历,是因为ArrayList所有的List都是Collection的子接口,而Collection是Iterable的子接口,ArrayList的父类AbstractList正确地实现了Iterable接口的iterator方法。

2、任何一个集合,无论是JDK提供的还是自己写的,只要想使用foreach循环遍历,就必须正确地实现Iterable接口

foreach使用限制

foreach在遍历集合的过程中不能修改集合中元素的值。不过,如果遍历的是数组,则不受此限制。

foreach在遍历过程中不能往集合中增加或删除元素,否则会抛出ConcurrentModificationException异常。即使在个别特殊情况下没有抛出这个异常,那也是因为巧合(下文会有说明)。

遍历过程中,集合或数组中同时只有一个元素可见,即只有“当前遍历到的元素”可见,而前一个或后一个元素是不可见的。

只能从前往后正向遍历,不能反向遍历

注意

  1. 在 subList 场景中,高度注意对父集合元素的增加或删除,均会导致子列表的遍历、增加、删除产生 ConcurrentModificationException 异常
  2. ArrayList之所以能使用foreach循环遍历,是因为ArrayList所有的List都是Collection的子接口,而Collection是Iterable的子接口,ArrayList的父类AbstractList正确地实现了Iterable接口的iterator方法。之前我自己写的ArrayList用foreach循环直接报空指针异常是因为我自己写的ArrayList并没有实现Iterable接口

3.任何一个集合,无论是JDK提供的还是自己写的,只要想使用foreach循环遍历,就必须正确地实现Iterable接口

【门朝大海,三河合水万年流】

最近发表
标签列表