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 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据