0 0

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

JDK7中的LinkedList中的addAll会先将要添加的Collection做toArray转化,然后在去迭代toArray后的数组进行添加操作,为什么不直接迭代Collection呢?难道只为了多线程下直接迭代Collection会有异常而进行这样的转化吗?
JDK7的代码如下:
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;
    }
2014年8月02日 15:54

1个答案 按时间排序 按投票排序

0 0

采纳的答案

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

2014年8月04日 11:58

相关推荐

    Array和Collection相互转换以及copy深度的小测

    3. 自定义转换:如果你需要转换成其他类型的`Collection`(如`ArrayList`或`LinkedList`),可以通过迭代遍历数组并调用`add()`方法实现。 **从Collection转换到Array** 1. **toArray()**: `Collection`接口提供了...

    Java 实例 - 数组转集合源代码-详细教程.zip

    要将一个基本类型的数组转换为`ArrayList`,我们可以使用`Arrays.asList()`方法,然后通过`ArrayList`的构造函数创建一个新的实例。以下是一个例子: ```java int[] intArray = {1, 2, 3, 4, 5}; List&lt;Integer&gt; int...

    java 去除重复元素

    对于List接口的实现类,如ArrayList或LinkedList,我们可以直接将列表传递给Set,Set会自动去重。 ```java List&lt;Integer&gt; list = new ArrayList(); list.add(1); list.add(2); list.add(3); list.add(2); list.add(1...

    删除其重复

    - `LinkedList`:同样实现了 List 接口,提供了基于双向链表的数据结构。 - **Set接口**:Set 不允许重复元素,它代表一组不重复的值。 - `HashSet`:实现了 Set 接口,提供了一种高效的查找方式,不允许重复元素...

    文本去重(去除数组中重复项)

    第二种方法使用了`List`接口的实现类`LinkedList`,以及`Arrays.asList()`方法。首先,将字符串数组转换为`List`,然后创建一个新的`LinkedList`,遍历原列表,如果新列表中不存在当前元素,则将其添加。最后,将...

    java面试宝典2021.docx

    - **方法**:Array内置方法较少,ArrayList提供更多的操作方法如addAll、removeAll等。 4. **线程安全的集合**: - **线程安全**:Vector、HashTable和Stack是线程安全的,而HashMap等非线程安全,可以使用...

    集合的一些题目

    虽然`ArrayList`实现了`Cloneable`接口,但是`LinkedList`并没有实现`Cloneable`接口。另外,两者确实都提供了两个构造函数,一个无参构造函数,一个接收`Collection`类型的构造函数。 **8. Map接口不是Collection...

    JAVA常用的数据结构和算法

    - 具体实现类如 `ArrayList`、`LinkedList` 实现 `List` 接口,`HashSet`、`TreeSet` 实现 `Set` 接口。 - `Map` 接口则由 `HashMap`、`TreeMap` 等实现。 #### 四、List 接口 List是一个有序的集合,它允许重复...

    认识类集、Collection接口

    Java集合框架还包含了一些直接或间接实现`Collection`接口的类,例如`ArrayList`、`LinkedList`、`HashSet`、`TreeSet`等。这些类提供了不同的性能特性和用途,比如: - **ArrayList**:基于数组实现,适合于随机...

    Java程序设计英文版课件:ch11 Collections of Objects.ppt

    常见的List实现包括ArrayList和LinkedList。 - **Set**:不允许有重复元素,保持元素的唯一性。HashSet是最常见的Set实现。 - **Queue**:遵循先进先出(FIFO)原则,用于处理等待处理的元素序列。例如,...

    资深程序员的Java面试题总结汇总.pdf

    9. `Arrays.asList()`将数组转换为List,`Collections.addAll()`将多个元素添加到集合中。 10. ArrayList与Vector都是动态数组,但ArrayList是非线程安全的,性能更好。 11. Array是固定大小的原始类型数组,...

    Generic in java programming language

    dest.addAll(src); // 正确:dest被推断为List } ``` 这里,`dest`的类型被自动推断为`List&lt;? super E&gt;`,这使得我们可以向`dest`添加任何类型的数据,只要这些数据是`E`的超类型。 #### 将遗留代码转换为使用...

    阿里必问200试题.docx

    26. 使用`ArrayList.addAll()`或`System.arraycopy()`实现数组与List的转换。 27. ArrayList和Vector都是基于数组实现,但ArrayList是非线程安全的,性能更好;Vector是线程安全的,但性能较差。 28. Array是C/C++...

    java课程设计 大二时候的课程设计 老师评定为优的很实用

    使用LinkedList实现表达式存储 - **LinkedList类**:在Java标准类库的`java.util`包中定义,可以动态地增加或减少元素数量。 - **构造方法与常用方法**: - `public LinkedList()` - `public Object getFirst()` ...

    Java 数组详解及示例代码

    正确做法是先转换为字符串再输出,如`System.out.println(Arrays.toString(intArray));` 3. **数组转ArrayList** 可以通过`Arrays.asList()`将数组转换为ArrayList,然后创建新的ArrayList对象:`ArrayList...

    Container

    #### 一、数组(Array) **数组定义**: 数组是一种基本的数据结构,用于存储相同类型的多个元素。数组是Java中最简单且高效的容器之一,能够提供快速的元素访问。 **特点**: - **访问速度快**: 允许随机访问元素。 -...

    JAVA ArrayList详细介绍(示例)

    ArrayList是Java集合框架中常用的列表实现之一,它是一个基于数组实现的动态列表。ArrayList的特点在于其容量能够随着元素数量的增长而自动扩展。下面我们将详细探讨ArrayList的各个方面。 1. **ArrayList的特性** ...

    Java 代码优化常见注意点

    - 使用`List`接口的`add(index, element)`方法代替`Collections.addAll(list, elements...)`,后者会创建一个额外的数组。 - 使用`ArrayList`而非`LinkedList`,除非频繁进行插入和删除操作,因为在随机访问上`...

    Java7_Examples:Java 7的源代码示例

    这在之前需要写成`Map, String&gt; map = new HashMap, String&gt;();` 4. **Strings in Switch语句** Java 7允许在switch语句中直接使用字符串,使得switch语句更加灵活,例如: ```java String day = "Monday"; ...

Global site tag (gtag.js) - Google Analytics