为什么java中的Collections的fill(),copy(),reverse()和shuffle()以这种方式实
发布时间:2020-05-28 23:38:43 所属栏目:Java 来源:互联网
导读:根据 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) {
|
根据 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.但是使用尺寸< FILL_THRESHOLD在上面? 我的意思是,与使用尺寸> = FILL_THRESHOLD的迭代器相比,没有任何显着的性能优势,而不是尺寸< 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) 编辑: 我的困惑是大小< FILL_THRESHOLD部分,而不是RandomAccess 解决方法我想这是因为通用列表并不是一个ArrayList.无法保证在恒定的O(1)时间内完成随机索引的设置.同时构建迭代器并对其进行处理会产生开销.总而言之,通过节省创建迭代器本身的开销,您可以牺牲这样一个事实:使用迭代器可以降低访问连续元素的复杂性. 这是因为list.set(i,obj)可能比itr.set(obj)更昂贵,但在后者中你会有管理迭代器的隐式开销.由于复杂性可以是线性O(n),因此对于较大的列表使用list.set(i,obj)可能实际上是一个问题. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
