AbstractList.java中RandomAccess的操作

Posted

技术标签:

【中文标题】AbstractList.java中RandomAccess的操作【英文标题】:Operation of RandomAccess in AbstractList.java 【发布时间】:2012-07-12 10:13:01 【问题描述】:

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

但我发现了一些奇怪的东西

这是java.util包中AbstractList.java中的subList方法

public List<E> subList(int fromIndex, int toIndex) 
    return (this instanceof RandomAccess ?
            new RandomAccessSubList<>(this, fromIndex, toIndex) :
            new SubList<>(this, fromIndex, toIndex));

RandomAccessSubList 类的实现:

class RandomAccessSubList<E> extends SubList<E> implements RandomAccess 
    RandomAccessSubList(AbstractList<E> list, int fromIndex, int toIndex) 
        super(list, fromIndex, toIndex);
    

    public List<E> subList(int fromIndex, int toIndex) 
        return new RandomAccessSubList<>(this, fromIndex, toIndex);
    

SubList 类实现:

SubList(AbstractList<E> list, int fromIndex, int toIndex) 
    if (fromIndex < 0)
        throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
    if (toIndex > list.size())
        throw new IndexOutOfBoundsException("toIndex = " + toIndex);
    if (fromIndex > toIndex)
        throw new IllegalArgumentException("fromIndex(" + fromIndex +
                                           ") > toIndex(" + toIndex + ")");
    l = list;
    offset = fromIndex;
    size = toIndex - fromIndex;
    this.modCount = l.modCount;

而且我认为在AbstractList类中,RandomAccessSubList是没用的,因为它把它的数据传递给SubList类,它的操作就像

new SubList<>(this, fromIndex, toIndex)); 

在 subList 方法中

【问题讨论】:

【参考方案1】:

由于根列表访问随机索引的速度很快,因此子列表的访问速度也很快,因此将子列表也标记为 RandomAccess 是有意义的。

SubList 和 RandomAccessSubList 通过继承共享相同的实现,但一个没有标记为 RandomAccess,另一个是。这就是子类有用的原因。

【讨论】:

这样一个可以被标记为RandomAccess 而另一个不是。这可以帮助Collections.binarySearch 之类的操作确定哪种算法更有效地用于具有这些性能特征的列表。 我还是不太清楚基本概念。为什么要实现 RandomAccess?甚至 Array 由于连续内存而提供更快的访问,而 ArrayList 在内部使用数组,那么这应该足以使其更快,对吗? JVM 是否为实现 RandomAccess 的列表做任何额外的事情? Louis 已经在他的评论中解释过了。 JVM 不会对 RandomAccess 列表做任何特别的事情,但是一些算法,如 bunarySearch,如果列表是 RandomAccess,则使用不同的实现,以更快。

以上是关于AbstractList.java中RandomAccess的操作的主要内容,如果未能解决你的问题,请参考以下文章

kotlin混淆后mapping定位

[NOI2012] 随机数生成器

Hbase delete遇到的常见异常: Exception in thread "main" java.lang.UnsupportedOperationException(代码

矩阵(快速幂):COGS 963. [NOI2012] 随机数生成器

Qt-排序

常用类