java集合list接口下的ArrayList,LinkedList的性能选择

一.集合中线程安全的类有:vector,stack,hashtable,enumeration,除此之外均是非线程安全的类与接口

collection结构参考如图:
java集合list接口下的ArrayList,LinkedList的性能选择
二。java.util.List
ArrayList和LinkedList
1.ArrayList是实现了基于动态数组的数据结构。
ArrayList的层级结构如图所示:

java集合list接口下的ArrayList,LinkedList的性能选择

2.LinkedList

1)LinkedList的继承关系如图:

java集合list接口下的ArrayList,LinkedList的性能选择

2)LinkedList底层的数据结构是基于双向循环链表的,且头结点中不存放数据,如下:

java集合list接口下的ArrayList,LinkedList的性能选择

ArrayList:
读取:从指定的位置(用index)检索一个对象其时间复杂度可表示为O(1)。
插入和删除:如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。
LinkedList:在插入、删除集合中任何位置的元素所花费的时间都是一样的—O(1) ,但它在索引一个元素的时候比较慢,为O(i),其中i是索引的位置。 因为LinkedList中的get方法是按照顺序从列表的一端开始检查,直到另外一端。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

结论:数组访问快,插入和删除慢。链表插入和删除快但读取较慢。
而属于数组的list有:ArrayList,Vector。
属于链表的list有:LinkedList

三。集合中几种遍历方式的性能比较

ForEach和Iterator都是通过迭代的方式,故其效率基本一致。

结论:(1)对于ArrayList和LinkedList,在size小于1000时,每种方式的差距都在几ms之间,差别不大,选择哪个方式都可以。

(2)对于ArrayList,无论size是多大,差距都不大,选择哪个方式都可以。

(3)对于LinkedList,当size较大时,建议使用迭代器或for-each的方式进行遍历,否则效率会有较明显的差距。

所以,综合来看,建议使用for-each,代码简洁,性能也不差。同时也要注意使用for-each前一定要做非空判断。

其中迭代的原理如下,它会通过指针的移动来保持特定的顺序

java集合list接口下的ArrayList,LinkedList的性能选择

具体的测试报告请参考:
http://blog.****.net/dengnanhua/article/details/64692191