通过在Java集合类中,查看类继承图和源码可以看出ArrayList和Vector都实现了RandomAccess接口,而LinkList却没有实现该接口,查看RandomAccess接口,发现里面是空的。
RandomAccess.java
package java.util;
/**
* 一大堆注释...
*/
public interface RandomAccess {
}
其实,该接口只是一个标识性接口(Marker),除了RandomAccess接口外,还有Cloneable (可拷贝克隆)、Serializable(被序列化),之后会有文章介绍这两个接口。
该接口的官方解释
List实现使用的
标记
界面,表明它们支持快速(通常为恒定时间)随机访问。 此接口的主要目的是允许通用算法更改其行为,以便在应用于随机访问列表或顺序访问列表时提供良好的性能。当施加到顺序访问列表(如
LinkedList
),用于操纵随机接入列表(如ArrayList
)最好算法可以产生二次行为。 鼓励通用列表算法在应用如果应用于顺序访问列表之前提供较差性能的算法,并且如果需要改变其行为以确保可接受的性能,则检查给定列表是否为instanceof
此接口。
此循环:
for (int i=0, n=list.size(); i < n; i++)
list.get(i);
比这个循环运行得更快:
for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
Collections类中的使用
此接口在Collections类中有很多地方都使用到了,比如下面的binarySearch方法
Collection.java
@SuppressWarnings("unchecked")
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
if (c==null)
return binarySearch((List<? extends Comparable<? super T>>) list, key);
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key, c);
else
return Collections.iteratorBinarySearch(list, key