Java 集合源码解析(2):ListIterator
来源:互联网 发布:mysql fetch array 编辑:程序博客网 时间:2024/06/07 06:00
ListIterator
根据官方文档介绍, ListIterator 有以下功能:
- 允许我们向前、向后两个方向遍历 List;
- 在遍历时修改 List 的元素;
- 遍历时获取迭代器当前游标所在位置。
注意,迭代器 没有当前所在元素一说,它只有一个游标( cursor )的概念,这个游标总是在元素之间,比如这样:
初始时它在第 0 个元素之前,调用 next() 游标后移一位:
调用 previous() 游标就会回到之前位置。当向后遍历完元素,游标就会在元素 N 的后面:
也就是说长度为 N 的集合会有 N+1 个游标的位置。
ListIterator 继承自 Iterator 接口,在 Iterator 的基础上增加了 6 个方法:
介绍一下新来的几个方法:
- void hasPrevious()
- 判断游标前面是否有元素;
- Object previous()
- 返回游标前面的元素,同时游标前移一位。游标前没有元素就报 java.util.NoSuchElementException 的错,所以使用前最好判断一下;
- int nextIndex()
- 返回游标后边元素的索引位置,初始为 0 ;遍历 N 个元素结束时为 N;
- int previousIndex()
- 返回游标前面元素的位置,初始时为 -1,同时报 java.util.NoSuchElementException 错;
- void add(E)
- 在游标 前面 插入一个元素
- 注意,是前面
- void set(E)
- 更新迭代器最后一次操作的元素为 E,也就是更新最后一次调用 next() 或者 previous() 返回的元素。
- 注意,当没有迭代,也就是没有调用 next() 或者 previous() 直接调用 set 时会报 java.lang.IllegalStateException错;
- void remove()
- 删除迭代器最后一次操作的元素,注意事项和 set 一样。
ListIterator 有两种获取方式
- List.listIterator()
- List.listIterator(int location)
区别在于第二种可以指定 游标的所在位置。
ListIterator 的具体实现?
AbstractList 作为 List 的直接子类,里面实现了 listIterator() 方法,并且有两个内部迭代器实现类:SimpleListIterator,FullListIterator:
listIterator() 返回的是 FullListIterator():
FullListIterator 继承了 SimpleListIterator, SimpleListIterator 实现了 Iterator 接口:
- 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
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
了解了 SimpleListIterator 后我们看下 FullListIterator 的具体实现:
- 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
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
可以看到 SimpleListIterator 的主要操作最后都交给子类来实现,List 的子类 ArrayList, LinkedList, Vector 由于底层实现原理不同(数组,双向链表),具体操作类实现有所不同。
等接下来分析到具体子类再看相关实现吧。
阅读全文
0 0
- Java 集合源码解析(2):ListIterator
- Java 集合源码解析(2):ListIterator
- Java 集合源码解析(2):ListIterator
- Java集合分析(2):ListIterator
- 解析java.util集合类源码(AbstractList内部类ListIterator和Itr)
- java 集合 ListIterator
- java 集合框架之LinkedList及ListIterator实现源码分析
- 集合框架(ListIterator)
- java集合之迭代器ListIterator
- [疯狂Java]集合:List、ListIterator
- Java 集合框架listIterator接口
- Java集合源码解析(一)ArrayList源码解析
- Java集合源码解析(二)HashMap源码解析
- Java集合源码解析(三)HashMap源码解析
- Java集合源码解析(四)TreeMap源码解析
- Java集合源码解析(五)HashSet源码解析
- 一步一步解析java集合框架HashMap源码(2)
- java集合类源码解析(2)---ArrayList
- Vue2 局部拓展extends 先于局部mixins执行
- 用python看段子
- SpringMVC和Servlet区别对比
- JAVA-常用包 与 import
- fiddler-实现https抓包
- Java 集合源码解析(2):ListIterator
- java 复制一个类中的属性给另一个具有相同属性的类
- 论文笔记:Spatial Transformer Networks(空间变换网络)
- 图片无限轮播
- 对于volist标签出现最后一个显示为空
- CI框架创建全局函数
- WPF 仿匿名地面站 (一)
- C++使用JMAIL链接库发送邮件
- 微服务的4大设计原则和19个解决方案