List用来当标记的,是一种标记接口,接口的非典型用法
意思是,随机访问任意下标元素都比较快用处,当要实现某些算法时,会判断当前类是否实现了RandomAccess接口。会根据结果选择不同的算法
实现中使用的标记接口 表示支持快速(一般恒定时间)随机访问。
此接口的目的是允许泛型算法改变它们的行为 提供良好的性能 当应用于随机或者
连续的访问列表。
最好的算法操纵随机访问列表 例如ArrayList 提供二次行为 当应用
顺序访问列表(例如LinkedList) 通用列表算法被鼓励去检查是否给定的列表
在应用一个算法之前,这个接口如果应用于顺序访问列表,则提供较差的性能。
如果必要,改变他们的行为以保证可接受性能。
一般的列表访问算法在访问列表元素之前,都被建议先使用instanceof关键字检查一下列表是否是一个RandomAccess子类,然后再决定采用随机还是顺序方式访问列表中的元素,这样可以保证访问算法拥有最佳的性能。
认识到随机和顺序之前的区别 访问常常模糊的。
例如List 实现渐近线性存取时间。 如果他们得到巨大的 但不变的访问时间在实践中。
这样的表实现 通常应该实现这个接口。作为经验法则,一个list实现 应该实现此接口。对于类的典型实例,这个循环:
for (int i=0, n=list.size(); i < n; i++)
list.get(i);
比这个loop循环:
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
快,那么它应该实现RandomAccess接口。
public static void shuffle(List<?> list, Random rnd) {
int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
} else {
Object arr[] = list.toArray();
// Shuffle array
for (int i=size; i>1; i--)
swap(arr, i-1, rnd.nextInt(i));
// Dump array back into list
ListIterator it = list.listIterator();
for (int i=0; i<arr.length; i++) {
it.next();
it.set(arr[i]);
}
}