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

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


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

另外,SynchronizedRandomAccessList继承SynchronizedList。
那检查的重点是什么?
请解释

最佳答案

你快到了。 Collections.synchronizedList(list)检查RandomAccess,因为某些列表实现了RandomAccess,而另一些则没有。

就像RandomAccess一样,此Serializablemarker interface。它告诉我们是否可以随机访问列表中的项目。即从ArrayList可以检索具有相同计算成本的任何项目。另一方面,我们需要遍历LinkedList才能到达第n个元素。

那么,Collections.synchronizedList(list)中发生了什么?它将RandomAccess List -s包装到RandomAccess同步列表中,而将非RandomAccess列表包装到非RandomAccess同步列表中。否则,这些列表是相同的。下面是SynchronizedRandomAccessList的代码。这是programming by difference的一个很好的例子。这两类几乎是相同的。

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


您可能会问,RandomAccess接口的意义何在?正如Holger所指出的,Collections.binarySearch()根据此接口进行决策。另一个示例是Collections.reverse()

09-25 21:08