AbstractSequentialList源码分析
java.util.AbstractSequentialList
抽象类继承自 java.util.AbstractList
抽象类。
一、AbstractSequentialList特点或规范
- 此类以最大限度地减少实现一个 “顺序访问” 数据存储(如:链表)所需的工作量。
- 如需 随机访问 数据(如:数组),应优先使用 AbstractList 而不是此类。
实现此类需要实现的方法
最简实现此类,只需要提供 listIterator(int)
和 size()
方法的实现。
随机访问
此类与 AbstractList 类相反,它在 列表迭代器 上实现了 “随机访问” 的方法:**get(int index)
,set(int index, E element)
,add(int index, E element)
** 和 **remove(int index)
**。
可修改性规范
- 如果子类实现是不可修改的列表,只需要实现
ListIterator
的hasNext()
,next()
,hasPrevious()
,previous()
和index()
方法。 - 如果子类实现需要可修改的列表,还应该实现
ListIterator
的set()
方法。 - 如果子类实现需要可变大小的列表,还应该实现
ListIterator
的remove()
和add()
方法。
构造器规范
子类实现应根据 java.util.Collection
接口规范中的建议,提供:
- 无参构造器
- 参数类型为 Collection 构造器
二、构造器
唯一构造器,**protected
** 权限。
1 |
|
三、继承自 AbstractList 方法
3.1 实现方法
get(int) 方法
索引随机访问:首先获取指向索引元素的列表迭代器(使用 **listIterator(index)
**),然后使用 ListIterator.next()
方法获取元素并返回。
1 |
|
set(int, E) 方法
修改列表:使用指定元素替换当前列表中指定位置的元素。
首先获取指向索引元素的列表迭代器(使用 **listIterator(index)
**),然后使用 ListIterator.next()
方法获取当前元素,并调用 ListIterator.set(E)
方法将其替换。
注意:如果列表迭代器未实现 set(E)
方法,则将抛出 UnsupportedOperationException
异常。
1 |
|
add(int, E) 方法
大小可变:将指定元素插入到当前列表中指定位置,并将当前位置的元素(如果有)和任何后续元素向右移动(将其添加到其索引中)。
首先获取指向索引元素的列表迭代器(使用 **listIterator(index)
**),然后使用 ListIterator.add()
方法插入指定的元素。
注意:如果列表迭代器未实现 add(E)
方法,则将抛出 UnsupportedOperationException
异常。
1 |
|
remove(int) 方法
删除此列表中指定位置的元素,并返回该元素。
将任何后续元素向左移位(从索引中减去一个)。
首先获取指向索引元素的列表迭代器(使用 **listIterator(index)
**),然后使用 ListIterator.remove()
方法删除该元素。
注意:如果列表迭代器未实现 remove()
方法,则将抛出 UnsupportedOperationException
异常。
1 |
|
addAll(int, Collection<? extends E>) 方法
将指定集合中所有元素插入到指定位置的当前列表中。将当前位置的元素(如果有)和任何后续元素向右移动(增加其索引)。
新元素将按照指定集合的迭代器返回的顺序出现在此列表中。
注意:如果列表迭代器未实现 add(E)
方法,则将抛出 UnsupportedOperationException
异常。
1 |
|
iterator() 方法
返回当前集合的 ListIterator
列表迭代器,依赖子类实现。
1 |
|
3.2 抽象方法
listIterator(int) 方法
获取当前列表的 ListIterator
列表迭代器,此方法依赖子类实现。
1 |
|