看你的需要了.LinkedList基于链表实现,插入元素的性能会比ArrayList高.
ArrayList基于数组实现,遍历的性能高于LinkedList.如果只执行一次,addAll会降低效率,ArrayList的addAll好像是通过调用Collection的toArray方法,然后System.arraycopy实现的.而LinkedList的toArray方法一定是进行了一次遍历.但是如果需要多次遍历,那么ArrayList还是在性能上会获取优势的.

解决方案 »

  1.   

    正如 xiaohaiz(老土进城,两眼通红)所说,一个是用链表而另一个是用数组来实现List的。分别适合于多变动和相对稳定的情况。
    1:“数据集进行随机增删”,从这一点上最好用LinkedList来实现。
    2:循环读取,只要用Iterator,ArrayList和LinkedList不会有太大的区别,一个是用数组下标来遍历,而另一个通过指针来遍历。
    3:ArrayList的addAll的实现为:
      public boolean addAll(Collection c) {
            Object[] a = c.toArray();
            int numNew = a.length;
    ensureCapacity(size + numNew);  // Increments modCount
            System.arraycopy(a, 0, elementData, size, numNew);
            size += numNew;
    return numNew != 0;
        }
    而LinkedList的实现为:
     public boolean addAll(Collection c) {
            return addAll(size, c);
        }
      public boolean addAll(int index, Collection c) {
            Object[] a = c.toArray();
            int numNew = a.length;
            if (numNew==0)
                return false;
    modCount++;        Entry successor = (index==size ? header : entry(index));
            Entry predecessor = successor.previous;
    for (int i=0; i<numNew; i++) {
                Entry e = new Entry(a[i], successor, predecessor);
                predecessor.next = e;
                predecessor = e;
            }
            successor.previous = predecessor;        size += numNew;
            return true;
        }
    前者很大程度上依赖于System.arrayCopy的效率,而arrayCopy是借助于本地方法实现的,
    如果本地方法是利用内存的直接拷贝,则速度会很快,如果利用循环遍历拷贝,速度肯定快不了。