微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么java中的Collections的fill(),copy(),reverse()和shuffle()以这种方式实现

根据 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)可能实际上是一个问题.

原文地址:https://www.jb51.cc/java/128780.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐