symagic_long 2014-08-02 15:54
浏览 400
已采纳

LinkedList实现addAll为什么要先转成Array

JDK7中的LinkedList中的addAll会先将要添加的Collection做toArray转化,然后在去迭代toArray后的数组进行添加操作,为什么不直接迭代Collection呢?难道只为了多线程下直接迭代Collection会有异常而进行这样的转化吗?
JDK7的代码如下:
[code="java"]
public boolean addAll(int index, Collection<? extends E> c) {
checkPositionIndex(index);

    Object[] a = c.toArray();
    int numNew = a.length; 
    if (numNew == 0)
        return false;

    Node<E> pred, succ;
    if (index == size) {
        succ = null;
        pred = last;
    } else {
        succ = node(index);
        pred = succ.prev;
    }

    for (Object o : a) {
        @SuppressWarnings("unchecked") E e = (E) o;
        Node<E> newNode = new Node<>(pred, e, null);
        if (pred == null)
            first = newNode;
        else
            pred.next = newNode;
        pred = newNode;
    }

    if (succ == null) {
        last = pred;
    } else {
        pred.next = succ;
        succ.prev = pred;
    }

    size += numNew;
    modCount++;
    return true;
}

[/code]

  • 写回答

1条回答 默认 最新

  • iteye_1858 2014-08-04 11:58
    关注

    这样是为了避免在putAll过程中Collection的内容又发生了改变。除了多线程外,还有一种可能是,你传入的Collection的内容又间接依赖了正在被putAll的list。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条
  • ¥15 Python报错怎么解决
  • ¥15 simulink如何调用DLL文件
  • ¥15 关于用pyqt6的项目开发该怎么把前段后端和业务层分离
  • ¥30 线性代数的问题,我真的忘了线代的知识了
  • ¥15 有谁能够把华为matebook e 高通骁龙850刷成安卓系统,或者安装安卓系统
  • ¥188 需要修改一个工具,懂得汇编的人来。