接口主要被list类所实现,以支持快速的随机访问(通常在一个恒定的时间之类)
本接口最重要的目的是允许通用算法去改变他们的行为以便于在随机访问或者顺序访问中提供更好的表现。
作用 :
1.支持稳定的快速随机访问
2.可以使用通用算法去提高顺序、随机访问的效率
不同的类型,对于相同的操作有不同的效率
对于某种操作的需要,产生
ArrayList是最好的算法之一
用于操纵随机访问列表(例如 ArrayList </ tt>)的最佳算法在应用于顺序访问列表(例如 LinkedList </ tt>)时会产生二次行为。鼓励使用通用列表算法检查给定列表是否为该接口的 instanceof </ tt>接口,然后再应用一种算法如果将其应用于顺序访问列表则性能较差并对其进行更改为确保可接受的性能而必要的行为
随机访问 使用 Array List,顺序访问可以使用LinkedList(如果使用ArrayList,会有二次行为,理解为效率更低)。
在检查指定list是否属于通用list之后。如果一个List算法的性能表现差,可以换成另一种List算法
随机访问和顺序访问的界限通常是模糊的,比如说,一些list的实现类在元素变大的时候提供接近线性的访问时间。不过实际上访问时间是恒定的
list.get比Iterator快(顺序访问)
先判断list是否实现了RandomAccess),如果实现了,使用swap(实际上使用了list.get(i)方法
public static void reverse(List<?> list) {
int size = list.size();
if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
swap(list, i, j);
} else {
// instead of using a raw type here, it's possible to capture
// the wildcard but it will require a call to a supplementary
// private method
ListIterator fwd = list.listIterator();
ListIterator rev = list.listIterator(size);
for (int i=0, mid=list.size()>>1; i<mid; i++) {
Object tmp = fwd.next();
fwd.set(rev.previous());
rev.set(tmp);
}
}
}
ListIterator 一个迭代器允许对list在任一方向上进行遍历,在遍历的过程中修改list,或者获取迭代器目前的位置,判断在该位置是否有元素。它始终是操作前一个或者后一个元素。
一个长度为n的list的迭代器,可能有n+1个光标位置。
在删除或者设置的时候,不是根据光标的位置进行修改,而是根据next或者previous进行修改