我对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)
我们为什么使用
1)10是一个常数,表示小列表和较大列表之间的截止值.如果a List不支持随机访问(这意味着它不支持O(1)时间list.get(i)),get(i)可能很昂贵,所以如果列表很小,你只想使用它.LinkedList是List不支持随机访问的示例.
2)两个for和while循环都是可能的,但是当Lists支持随机访问(或足够小)时,使用它get而set不是创建迭代器可能更有效.