作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个关于 Collections.class 和“复制”方法的问题。
1) 如果以下面的代码为条件,为什么我们要在秒内检查源列表的大小,为什么它必须小于 10?为什么它如此重要?
2) 此外,为什么我们在这个条件语句中使用 for 循环而不是 while - 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());
}
}
}
}
我们为什么要使用
最佳答案
1) 10 是一个常量,表示小列表和大列表之间的分界线。如果 List
不支持随机访问(这意味着它不支持 O(1)
时间用于 list.get(i)
), get(i)
可能很昂贵,所以你只想在列表很小的时候使用它。 LinkedList
是不支持随机访问的 List
示例。
2) for
和 while
循环都是可能的,但是当 List
支持随机访问(或足够小)时,它使用 get
和 set
可能比创建迭代器更有效。
关于java - For循环而不是集合中的while循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54071535/
我是一名优秀的程序员,十分优秀!