5

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

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

这是 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 方法中

4

1 回答 1

5

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

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

于 2012-07-12T10:21:52.587 回答