Theo javadoc ... Collections.fill() được viết như sau:Tại sao điền(), sao chép(), reverse() và shuffle() của bộ sưu tập trong java được thực hiện theo cách này
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);
}
}
}
Dễ hiểu tại sao họ không sử dụng listIterator cho
if (size < FILL_THRESHOLD || list instanceof RandomAccess)
điều kiện là của RandomAccess. Nhưng whats việc sử dụng size < FILL_THRESHOLD
ở trên?
Ý tôi là có lợi ích hiệu suất đáng kể nào khi sử dụng iterator
cho size>=FILL_THRESHOLD
chứ không phải cho size < FILL_THRESHOLD
?
Tôi thấy phương pháp tương tự cho Collections.copy() cũng:
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;
Cùng tiếp cận cho dưới đây:
public static void reverse(List<?> list)
public static void shuffle(List<?> list, Random rnd)
EDIT:
Sự nhầm lẫn của tôi là dành cho phần size<FILL_THRESHOLD
, không phải cho RandomAccess
Bạn có nhầm lẫn bởi vì có hai ngưỡng khác nhau được truyền vào một không? – Mirko
@Mirko: Không hề vì lý do đó.Tôi có thể hiểu rất rõ rằng cả hai phương pháp đều có các yêu cầu khác nhau. Hai ngưỡng khác nhau có ý nghĩa. –