RandomAccess在现代Java中有什么价值吗?

时间:2015-03-19 21:58:41

标签: java collections

有一个特殊的界面是documented as such(仅提取):

  

List实现使用的标记接口,表示它们支持快速(通常是恒定时间)随机访问。此接口的主要目的是允许通用算法更改其行为,以便在应用于随机或顺序访问列表时提供良好的性能。

列出的实现是(从JDK 8开始):

ArrayList, AttributeList, CopyOnWriteArrayList, RoleList, RoleUnresolvedList, Stack, Vector

其中两个(实际上后两个)在您今天生成的任何代码中都已过时。

现在,作为一个警告,我的研究并不广泛,以至于我一时兴起都在问这个问题。在这个时候有人会看到需要使用这个接口,甚至实现它吗?

3 个答案:

答案 0 :(得分:2)

此标记接口可用于算法实现者。实现此接口的列表可以与不具有随机访问权限的列表进行不同的处理。

例如,“如果列表是随机访问,则使用二进制搜索,否则使用线性搜索。”

一个具体的例子是Guava's Lists.transform

public static <F, T> List<T> transform(
        List<F> fromList, Function<? super F, ? extends T> function) {
   return (fromList instanceof RandomAccess)
       ? new TransformingRandomAccessList<F, T>(fromList, function)
       : new TransformingSequentialList<F, T>(fromList, function);
}

答案 1 :(得分:0)

文档提供了如何使用此接口的一个很好的示例:作为指标。我可以想象这样一个用例:你有一个列表,不知道它是通过迭代还是随机访问来表现得更快:

void process(List<E> items) {
    if (items instanceof RandomAccess)
        for (int i = 0; i < items.size(); i++) System.out.println(items.get(i));
    else
        for (E item : items) System.out.println(item);
}

答案 2 :(得分:0)

快速浏览一下OpenJDK java.util.Collections code,这仍然是有用的。

例如,Collections.binarySearch方法使用此标记接口在两个实现之间进行选择。

public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) {
     if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
         return Collections.indexedBinarySearch(list, key);
     else
         return Collections.iteratorBinarySearch(list, key);
 }