根据javadoc ... Collections.fill()编写如下:
public static <T> void fill(List<? super T> list, T obj) {
int size = list.size();
if (size < FILL_THRESHOLD || list instanceof RandomAccess) {
for (int i=0; i<size; i++)
list.set(i, obj);
} else {
ListIterator<? super T> itr = list.listIterator();
for (int i=0; i<size; i++) {
itr.next();
itr.set(obj);
}
}
}
很容易理解他们为什么不使用listIterator
if (size < FILL_THRESHOLD || list instanceof RandomAccess)
RandomAccess的条件。但是在上面使用size < FILL_THRESHOLD
是什么意思?
我的意思是,与iterator
使用size>=FILL_THRESHOLD
而不是size < FILL_THRESHOLD
相比,是否有显着的性能优势?
我也看到了Collections.copy()的相同方法:
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");
if (srcSize < COPY_THRESHOLD ||
(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());
}
}
}
供参考:
private static final int FILL_THRESHOLD = 25;
private static final int COPY_THRESHOLD = 10;
以下相同的方法:
public static void reverse(List<?> list)
public static void shuffle(List<?> list, Random rnd)
编辑:
我的混淆是size<FILL_THRESHOLD
部分,而不是RandomAccess
答案 0 :(得分:3)
我想这是因为通用列表并不是ArrayList
。无法保证在常量 O(1)时间内设置随机索引。同时构建迭代器并对其进行处理会产生开销。
总而言之,对于小型列表,您可以牺牲这样一个事实,即通过节省创建迭代器本身的开销,使用迭代器可以降低访问连续元素的复杂性。
这是因为list.set(i, obj)
可能比itr.set(obj)
更昂贵,但在后者中你会有管理迭代器的隐式开销。由于复杂性可以是线性的 O(n),因此对于较大的列表使用list.set(i, obj)
可能实际上是一个问题。
答案 1 :(得分:1)
Java 1.2,它引入了集合框架,Java 1.3使用了直接的方法和ListIterator:
public static void fill(List list, Object o) {
for (ListIterator i = list.listIterator(); i.hasNext(); ) {
i.next();
i.set(o);
}
}
阈值是与Java 1.4中的RandomAccess标记接口一起引入的(所有这些都基于Oracle网站上JDK的遗留代码)。
我认为这是一种优化旧的垃圾收集算法 - 这些较旧的算法具有heavy penalties for creating a new object(例如ListIterator)。因此,使用非O(1)列表的setter是有意义的。
具有讽刺意味的是, Java 1.4.1 引入了一个新的垃圾收集器,它使得对象创建对于诸如迭代器之类的短期对象来说便宜得多。