为什么Collections.synchronizedList(list)在内部使用instanceof检查?

1 java collections java-8

我正在查看Collections类的源代码.我遇到了方法 Collections.synchronizedList(list)

public static <T> List<T> synchronizedList(List<T> list) {
    return (list instanceof RandomAccess ?
            new SynchronizedRandomAccessList<>(list) :
            new SynchronizedList<>(list));
}
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么我们要检查列表是否属于RandomAccess类型.我知道ArrayList实现了这个接口,而LinkedList没有.

此外,SynchronizedRandomAccessList继承SynchronizedList.那检查有什么意义呢?请解释

Tam*_*Rev 5

你快到了.Collections.synchronizedList(list)检查是RandomAccess因为某些列表实现RandomAccess而其他列表没有.

RandomAccess是一个标记界面,就像Serializable.它告诉我们是否可以随机访问列表中的项目.即,ArrayList我们可以检索具有相同计算成本的任何项目.另一方面,我们需要通过a LinkedList来获取第n个元素.

那么,发生了Collections.synchronizedList(list)什么?它将RandomAccess List-s 包装到RandomAccess同步列表中,同时将非RandomAccess列表包装到非RandomAccess同步列表中.否则这些列表是相同的.以下是代码SynchronizedRandomAccessList.这是差异编程的一个很好的例子.这两个类几乎完全相同.

static class SynchronizedRandomAccessList<E>
    extends SynchronizedList<E>
    implements RandomAccess {

    SynchronizedRandomAccessList(List<E> list) {
        super(list);
    }

    SynchronizedRandomAccessList(List<E> list, Object mutex) {
        super(list, mutex);
    }

    public List<E> subList(int fromIndex, int toIndex) {
        synchronized (mutex) {
            return new SynchronizedRandomAccessList<>(
                list.subList(fromIndex, toIndex), mutex);
        }
    }

    private static final long serialVersionUID = 1530674583602358482L;

    /**
     * Allows instances to be deserialized in pre-1.4 JREs (which do
     * not have SynchronizedRandomAccessList).  SynchronizedList has
     * a readResolve method that inverts this transformation upon
     * deserialization.
     */
    private Object writeReplace() {
        return new SynchronizedList<>(list);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能会问,RandomAccess界面有什么意义?正如霍尔格指出的那样,Collections.binarySearch()根据这个界面做出决定.另一个例子是Collections.reverse().