根據的Javadoc ... Collections.fill()寫如下:爲什麼填(),複製(),反向(),並在Java集合洗牌()來實現這樣
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 for
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());
}
}
}
FYI:
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
您是否感到困惑,因爲存在兩種不同的閾值? – Mirko
@Mirko:完全不是因爲這個。我可以很好地理解,這兩種方法都有不同的要求。因此,兩種不同的閾值是合理的。 –