今天有点无聊,来学学 AbstractSequentialList 解解闷 吧!
( Sequential 相继的,按次序的)
AbstractSequentialList 继承自 AbstractList,是 LinkedList
的父类,是 List 接口 的简化版实现。
简化在哪儿呢?简化在 AbstractSequentialList 只支持按次序访问,而不像 AbstractList 那样支持随机访问。
想要实现一个支持按次序访问的 List的话,只需要继承这个抽象类,然后把指定的抽象方法实现就好了。需要实现的方法:
你需要实现一个 ListIterator
, 实现它的 hasNext()
, hasPrevious()
, next()
, previous()
, 还有那几个 获取位置 的方法,这样你就得到一个不可变的 ListIterator 了。如果你想让它可修改,还需要实现 add()
, remove()
, set()
方法。
正如在 每个 Collection 接口 中提倡的那样,AbstractSequentialList 的子类需要提供两个构造函数,一个无参,一个以 Collection 为参数。
AbstractSequentialList 在 AbstractList 的基础上实现了以下方法:
public Iterator<E> iterator() {
//调用继承自
return listIterator();
}
//继承 AbstractList 的 listIterator()
public ListIterator<E> listIterator() {
return listIterator(0);
}
//需要实现类实现的方法
public abstract ListIterator<E> listIterator(int index);
public void add(int index, E element) {
try {
//调用 ListIterator.add()
listIterator(index).add(element);
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
UnsupportedOperationException
错。public E get(int index) {
try {
return listIterator(index).next();
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
public E set(int index, E element) {
try {
ListIterator<E> e = listIterator(index);
E oldVal = e.next();
e.set(element);
return oldVal;
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
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);
}
}
int i=0, n=list.size(); i < n; i++)
list.get(i);
get()太慢,还不如用迭代器:
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/