1.for each
1.1 for each循环也叫增强for循环,是jdk1.5后有的用于循环遍历数组和集合的方式;其底层原理还是使用的iterator 来实现处理。
1.2 由于底层是迭代器,所以遍历的过程中不能对元素进行增删操作;如果在for each循环过程中使用集合的remove方法操作后,会报错java.util.ConcurrentModificationException。原因是for each底层是iterator实现,iterator在初始化过程中会定义两个变量:
int expectedModCount = modCount;
但是在集合的remove方法后,会更新modCount++,所以再iterator继续循环的时候,会调用next方法进行检查,在检查中会有expectedModCount = modCount这两个字段的是否相等的检查,所以删除后会报错。故而for each循环不支持删除元素操作;
1.3 for each使用案例:
使用案例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package entity; import org.junit.Test; import java.util.ArrayList; import java.util.List; public class Test20220706 { @Test public void learn(){ List<Integer> list = new ArrayList<>(); for (int i = 0; i <10 ; i++) { list.add(i); } for (int eam : list) { System.out.print(eam); } } }
运行结果:
1
20123456789
2.iterator 迭代器
2.1 iterator 迭代器是专门用来遍历Collection
中的元素而提供的一个工具接口;
由于Collection接口中没有方法是带有索引作为参数,所以不能进行for循环遍历,因此Iterator迭代器主要用来迭代访问 Collection中的元素。
3.1 Iterator迭代器是一个接口,不能直接使用,需要使用Iterator接口的实现类对象。获取实现类的方式比较特殊,是Collection接口中有一个iterator()方法,这个方法返回的就是迭代器的实现类对象。
例如:
Iterator iterator= list.iterator();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19package entity; import org.junit.Test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test20220706 { @Test public void learn(){ //创建list List<Integer> list = new ArrayList<>(); //给list添加元素 for (int i = 0; i <10 ; i++) { list.add(i); } //获取Iterator接口的实现类 Iterator iterator= list.iterator(); } }
3.2 Iterator迭代器的使用:
1).获取要循环的集合。
2).使用iterator()方法获取迭代器实现类;
3).使用.hasnext()方法来判断是否有元素信息;
4).然后使用.next()方法进行获取具体元素处理;
案例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26package entity; import org.junit.Test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test20220706 { @Test public void learn(){ //创建list List<Integer> list = new ArrayList<>(); //给list添加元素 for (int i = 0; i <10 ; i++) { list.add(i); } //获取Iterator接口的实现类 Iterator iterator= list.iterator(); //检查是否有元素 while (iterator.hasNext()){ //获取具体元素 Object it = iterator.next(); //具体业务处理 System.out.print(it); } } }
4.for each 循环和 iterator 迭代器
使用的话,一般普通数据集合遍历使用for each 循环处理。具体使用性能对比如下:
4.1 运行性能方面
1).ArrayList集合对随机访问比较快,for each循环中的get()方法,采用的就是随机访问的方式,因此在对ArrayList集合循环时,for each循环效率高些。
2).LinkedList集合是顺序访问比较快,iterator中的next()方法,采用的是顺序访问的方式,因此在对LinkedList集合循环时,使用iterator较快些。
最后
以上就是鳗鱼白羊最近收集整理的关于for each 循环和 iterator 迭代器的区别和使用的全部内容,更多相关for内容请搜索靠谱客的其他文章。
发表评论 取消回复