Collection遍历的两种方法

迭代器

  1. Iterator对象称为迭代器,主要用于遍历Collection集合中的元素
  2. 所有实现了Collection接口的集合类都有一个Iterator()方法,用以返回一个实现了iterator接口的对下个,即可以返回一个迭代器。
  3. Iterator的结构
  4. Iterator仅用于遍历集合,Iterator本身并不存放对象。

迭代器执行原理

image-20220704175415899

1
2
3
4
5
6
7
8
//对于remove方法,还方法删除由next返回的最新项,此后我们不能调用remove,直到next再一次调用之后
public interface Inerator<E>
{
boolean hasNext();
E next();
void remove();
}

迭代器的删除操作与Collection的remove方法其实效率快很多,当我们一个集合中拥有213456,我们要删除其中的偶数,结果应该为135,如果调用collection方法,每一次删除之前都要重新遍历,事件开销比较大,但是如果使用迭代器的remove方法,效率会快很多。

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
26
27
28
29
30
package 其他;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
* @author 21050
*/
public class IteratorTest {
public static void main(String[] args) {
LinkedList<Integer> list=new LinkedList<>();
list.add(2);
list.add(1);
list.add(3);
list.add(5);
IteratorTest iteratorTest=new IteratorTest();
iteratorTest.removeEvenVer(list);
}

public void removeEvenVer(List<Integer> list){
Iterator<Integer> integerIterator= list.iterator();
while (integerIterator.hasNext()){
if (integerIterator.next()%2==0){
integerIterator.remove();
}

}
}
}

这时有的小伙伴会说我们使用增强for循环,不一样可以实现这个吗

1
2
3
4
5
6
7
public void remove(List<Integer> list){
for (Integer i:list){
if (i%2==0){
list.remove(i);
}
}
}

image-20220614102634061

但是我们要注意,增强for循环所带来的弊端,增强for循环底层的实现基础迭代器,但是在这个过程中modcount与expectedModCount不同步导致的,在最后的判断中抛出异常,在进行删除添加等操作的时候,尽量不要使用增强for循环。

Java ConcurrentModificationException异常原因和解决方法 - Matrix海子 - 博客园 (cnblogs.com)

Iterator iterator=coll.iterator();//得到一个集合的迭代器

//hasNext()判断是否还有下一个元素

//next()指针向下启动,将下移以后集合位置上的元素返回,所以调用next方法之前,则应该先调用hasNext方法来判断是否已经结束,否则可能会发生异常。

image-20220307195612166

我们运行以下代码

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
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {
public static void main(String [] args){
Collection col= new ArrayList();
col.add(123);
col.add(56);
col.add("jack");
col.add(10);

//要想遍历col集合,需要先得到col对应的迭代器Iterator
Iterator iterator=col.iterator();
//利用while循环进行遍历
while (iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("遍历完毕");
//重置迭代器
iterator= col.iterator();
//下面可以开始二次遍历

}
}
image-20220704175559182

注意:当我们while循环结束后,这时的迭代器已经指向最后的元素,如果我们再一次输出,就会发生报错。若我们想要在同一次运行中再一次遍历这个集合,则需要重置我们的迭代器

增强for循环遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.ArrayList;
import java.util.Collection;

public class Test {
public static void main(String [] args){
Collection col= new ArrayList();
col.add(123);
col.add(56);
col.add("jack");
col.add(10);

for (Object a:col){
System.out.println(a);
}

}
}

image-20220704175649647

注意,虽然还是for循环,但是本质还是利用了迭代器,利用debug的方法可以进入,是简化版本的die’dai’qi

image-20220704175711885练习

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {
public static void main(String [] args){

Dog dog1=new Dog("ahhua",12);
Dog dog2=new Dog("a",15);
Dog dog3=new Dog("ah",13);
//迭代器遍历
Collection collection=new ArrayList();
collection.add(dog1);
collection.add(dog2);
collection.add(dog3);
Iterator iterator=collection.iterator();

while (iterator.hasNext()){
System.out.println(iterator.next());
}
//迭代器指针归位
iterator=collection.iterator();
for (Object a:collection){
System.out.println(a);
}

}
}
class Dog{
private String name;
private int age;

public Dog(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

image-20220704175724420