对于循环,而不是集合中的循环

Jan*_*nek 4 java collections

我对Collections.class和"copy"方法有疑问.

1)为什么我们在下面的代码条件下检查源列表的大小,以及为什么它必须小于10?为什么这么重要?

2)更重要的是,为什么我们在这个条件中使用for循环而在 - while (hasNext())

public static <T> void copy(List<? super T> dest, List<? extends T> src) {
    int srcSize = src.size();
    if (srcSize > dest.size()) {
        throw new IndexOutOfBoundsException("Source does not fit in dest");
    } else {
        if (srcSize < 10 || src instanceof RandomAccess && dest instanceof RandomAccess) {
            for (int i = 0; i < srcSize; ++i) {
                dest.set(i, src.get(i));
            }
        } else {
            ListIterator<? super T> di = dest.listIterator();
            ListIterator<? extends T> si = src.listIterator();

            for (int i = 0; i < srcSize; ++i) {
                di.next();
                di.set(si.next());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们为什么使用

Era*_*ran 5

1)10是一个常数,表示小列表和较大列表之间的截止值.如果a List不支持随机访问(这意味着它不支持O(1)时间list.get(i)),get(i)可能很昂贵,所以如果列表很小,你只想使用它.LinkedListList不支持随机访问的示例.

2)两个forwhile循环都是可能的,但是当Lists支持随机访问(或足够小)时,使用它getset不是创建迭代器可能更有效.