Young Kbt blog Young Kbt blog
首页
  • java基础

    • Java基础
    • Java集合
    • Java反射
    • JavaJUC
    • JavaJVM
  • Java容器

    • JavaWeb
  • Java版本新特性

    • Java新特性
  • SQL 数据库

    • MySQL
    • Oracle
  • NoSQL 数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • ActiveMQ
    • RabbitMQ
    • RocketMQ
    • Kafka
  • 进阶服务

    • Nginx
  • Spring
  • Spring Boot
  • Spring Security
  • 设计模式
  • 算法
  • 知识
  • 管理

    • Maven
    • Git
  • 部署

    • Linux
    • Docker
    • Jenkins
    • Kubernetes
  • 进阶

    • TypeScript
  • 框架

    • React
    • Vue2
    • Vue3
  • 轮子工具
  • 项目工程
  • 友情链接
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 关于
    • Vue2-Admin (opens new window)
    • Vue3-Admin(完善) (opens new window)
GitHub (opens new window)

Shp Liu

朝圣的使徒,正在走向编程的至高殿堂!
首页
  • java基础

    • Java基础
    • Java集合
    • Java反射
    • JavaJUC
    • JavaJVM
  • Java容器

    • JavaWeb
  • Java版本新特性

    • Java新特性
  • SQL 数据库

    • MySQL
    • Oracle
  • NoSQL 数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • ActiveMQ
    • RabbitMQ
    • RocketMQ
    • Kafka
  • 进阶服务

    • Nginx
  • Spring
  • Spring Boot
  • Spring Security
  • 设计模式
  • 算法
  • 知识
  • 管理

    • Maven
    • Git
  • 部署

    • Linux
    • Docker
    • Jenkins
    • Kubernetes
  • 进阶

    • TypeScript
  • 框架

    • React
    • Vue2
    • Vue3
  • 轮子工具
  • 项目工程
  • 友情链接
  • 本站

    • 分类
    • 标签
    • 归档
  • 我的

    • 收藏
    • 关于
    • Vue2-Admin (opens new window)
    • Vue3-Admin(完善) (opens new window)
GitHub (opens new window)
  • Java 基础 - SE

  • Java 进阶 - SE

  • Java 集合 - Collection

    • Java 集合 - 集合概序
    • Java 集合 - ArrayList
    • Java 集合 - LinkedList
    • Java 集合 - Vector 和 Stack
    • Java 集合 - List 总结
    • Java 集合 - HashMap
    • Java 集合 - Set
    • Java 集合 - HashSet
    • Java 集合 - TreeSet
    • Java 集合 - 迭代器
      • 迭代器
      • hasNext、next实现原理
      • 两种迭代器
        • Iterator
        • ListIterator
    • Java 集合 - 泛型
    • Java 集合 - Collections 工具类
  • Java 并发 - JUC

  • Java 容器 - Web

  • Java 底层 - JVM

  • Java 版本 - 新特性

  • Java
  • Java 集合 - Collection
Young Kbt
2021-10-23
目录

Java 集合 - 迭代器

  • 迭代器
  • hasNext、next实现原理
  • 两种迭代器

# 迭代器

所有实现了 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

#

编辑此页 (opens new window)
更新时间: 2024/11/02, 18:07:00
Java 集合 - TreeSet
Java 集合 - 泛型

← Java 集合 - TreeSet Java 集合 - 泛型→

最近更新
01
技术随笔 - Element Plus 修改包名 原创
11-02
02
Reactor - 扩展性
11-02
03
Reactor - 最佳实践
11-02
更多文章>
Theme by Vdoing | Copyright © 2021-2024 Young Kbt | blog
桂ICP备2021009994号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式