【问题标题】:Does RandomAccess have any value in modern day Java?RandomAccess 在现代 Java 中有什么价值吗?
【发布时间】:2015-03-19 21:58:40
【问题描述】:

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

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

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

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

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

现在,作为警告,我的研究范围并不广泛,以至于我一时兴起才提出这个问题。目前是否有任何用例可以看出需要使用此接口,甚至实现它?

【问题讨论】:

    标签: java collections


    【解决方案1】:

    此标记接口可能对算法实现者有用。实现此接口的列表可以与没有随机访问的列表不同的处理方式。

    例如“如果列表是随机访问的,使用二分查找,否则使用线性查找。”

    一个例子是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);
    }
    

    【讨论】:

      【解决方案2】:

      快速浏览一下 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);
       }
      

      【讨论】:

        【解决方案3】:

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

        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);
        }
        

        【讨论】:

        • 这只是重申代码中的第一个引号。我很想知道具体的非玩具示例。
        猜你喜欢
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 2018-07-05
        相关资源
        最近更新 更多