看你的需要了.LinkedList基于链表实现,插入元素的性能会比ArrayList高.
ArrayList基于数组实现,遍历的性能高于LinkedList.如果只执行一次,addAll会降低效率,ArrayList的addAll好像是通过调用Collection的toArray方法,然后System.arraycopy实现的.而LinkedList的toArray方法一定是进行了一次遍历.但是如果需要多次遍历,那么ArrayList还是在性能上会获取优势的.
ArrayList基于数组实现,遍历的性能高于LinkedList.如果只执行一次,addAll会降低效率,ArrayList的addAll好像是通过调用Collection的toArray方法,然后System.arraycopy实现的.而LinkedList的toArray方法一定是进行了一次遍历.但是如果需要多次遍历,那么ArrayList还是在性能上会获取优势的.
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是借助于本地方法实现的,
如果本地方法是利用内存的直接拷贝,则速度会很快,如果利用循环遍历拷贝,速度肯定快不了。