Java 集合 - 迭代器
# 迭代器
所有实现了 Collection 接口的容器类都有一个 iterator 方法用以返回一个实现 Iterator 接口的对象
Iterator 对象称作为迭代器,用以方便的对容器内元素的遍历操作,Iterator 接口定义了如下方法:
boolean hashNext()
:判断是否有元素没有被遍历Object next()
:返回游标当前位置的元素并将游标移动到下一个位置void remove()
:删除游标左边的元素,在执行完 next 之后该操作只能执行一次
问题:如何遍历 Map 集合呢?
方法 1:通过迭代器 Iterator 实现遍历
获取 Iterator:Collection 接口的 iterator()
方法
Iterator 的方法:
boolean hasNext()
: 判断是否存在另一个可访问的元素Object next()
: 返回要访问的下一个元素
Set keys = dogMap.keySet(); // 取出所有 key 的集合
Iterator it = keys.iterator(); // 获取 Iterator 对象
while (it.hasNext()) {
String key = (String) it.next(); // 取出 key
Dog dog = (Dog) dogMap.get(key); // 根据 Key 取出对应的值
System.out.println(key + "\t" + dog.getStrain());
}
1
2
3
4
5
6
7
2
3
4
5
6
7
方法 2:增强 for 循环
for(元素类型t 元素变量x : 数组或集合对象){
引用了x的java语句
}
1
2
3
2
3
# hasNext、next实现原理
初始化 cursor
为 0,执行 hasNext
后,判断 cursor
到达数组长度,如果没有,则返回 true。
执行 next
方法,将 cursor
加 1,然后返回 cursor
没加 1 前的数据。
public class ArrayList<E>{
transient Object[] elementData; // 数组
private int size; // 数组长度
private class Itr implements Iterator<E> {
int cursor; // 指针,初始为0
int lastRet = -1; // 返回的元素的索引值,初始为 -1,即数组没有元素,返回 -1
public boolean hasNext() {
return cursor != size;// 相等返回false,不相等返回true
}
public E next() {
int i = cursor;
Object[] elementData = ArrayList.this.elementData; // 将全局变量复制一份给局部遍历,防止污染全局变量
cursor = i + 1;
return (E) elementData[lastRet = i];
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 两种迭代器
# Iterator
public void test(){
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
缺点:该迭代器和 list 同时对集合进行操作报错 ConcurrentModificationException
:并发修改异常
public void test(){
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
if("cc".equals(iterator.next())){
list.add("kk"); // 报错:并发修改异常,原因list和iterator同事对集合进行操作,不可取
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# ListIterator
解决迭代器和 list 同时对集合进行操作报错,直接使用该迭代器对集合进行操作,自动同步到 list 集合里
public void test(){
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
ListIterator<String> iterator = list.listIterator();
while(iterator.hasNext()){
if("cc".equals(iterator.next())){
iterator.add("kk");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#
编辑此页 (opens new window)
更新时间: 2024/11/02, 18:07:00