JAVA集合源码攻坚战(8)——AbstractSequentialList
前言
前面已经初步介绍过了Arraylist了,那么后面就应该讲讲经常会拿来和ArrayList进行对比的LinkedList吧,不过因为这之间还有个区别,因为LinkedList并不是直接继承了AbstractList的,中间还有个抽象类,今天就先来讲讲这个抽象类吧。
正文
AbstractSequentialList继承了AbstractList,这里不多说,想想也能知道,应该是为了实现AbstractList的某些功能,从命名来看,也是一个抽象类,然后是顺序相连的一个list。
可以看出,他和ArrayList是同级的,下面只有一个实现类——LinkedList
内部方法结构也比较简单,毕竟是一个抽象类,没有太多实现
简介
根据java 8 的官方简介
该类提供了一个对list的骨架型的实现。该类实现了一个按次序访问的功能。如果要实现随机访问,应该先使用AbstractList。该类与实现随机访问的方法不同,它不支持随机访问。
实现该方法,只需要提供对listIterator和size方法的实现。
对于一个无法修改的list,开发人员值需要实现该list的迭代器的hasNext,next,hasPrevious,previous和index方法即可。
对于一个可修改的lsit,开发人员额外需要实现set方法。对于一个尺寸可变的list,开发人员需要额外实现迭代器的remove和add方法。
对于他的子类,应该像Collection接口中建议的一样,需要提供无参和一个collention的构造方法。
构造函数
protected AbstractSequentialList() {
}
没什么好说的,无参构造器
get操作
public E get(int index) {
try {
// 调用ListIterator迭代获取
return listIterator(index).next();
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
set操作
public E set(int index, E element) {
try {
// 仍旧利用ListIterator迭代器来操作
ListIterator<E> e = listIterator(index);
E oldVal = e.next();
e.set(element);
return oldVal;
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
add操作
public void add(int index, E element) {
try {
listIterator(index).add(element);
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
remove操作
public E remove(int index) {
try {
ListIterator<E> e = listIterator(index);
E outCast = e.next();
e.remove();
return outCast;
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
addAll操作
public boolean addAll(int index, Collection<? extends E> c) {
try {
boolean modified = false;
ListIterator<E> e1 = listIterator(index);
Iterator<? extends E> e2 = c.iterator();
while (e2.hasNext()) {
e1.add(e2.next());
modified = true;
}
return modified;
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
从上面这些操作来看,都是利用迭代器进行操作的,因为本身该类就要求子类不支持随机访问的,只能按照顺序访问,所以,这就很依赖于迭代器是否涉及的够好,不然很影响该类及其子类的性能。