目录

迭代器

# 迭代器

所有实现了 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:增强 for 循环

for(元素类型t 元素变量x : 数组或集合对象){
	引用了x的java语句
}
1
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

# 两种迭代器

# 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

缺点:该迭代器和 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

# 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

#

更新时间: 2024/01/17, 05:48:13
最近更新
01
JVM调优
12-10
02
jenkins
12-10
03
Arthas
12-10
更多文章>