ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储一系列的String或者Integer。
1 问题
那么ArrayList和LinkedList在性能上有什么差别呢?什么时候应该用ArrayList什么时候又该用LinkedList呢?
2 方法
当一个元素被加到ArrayList的最开端时,所有已经存在的元素都会后移,这就意味着数据移动和复制上的开销。相反的,将一个元素加到LinkedList的最开端只是简单的未这个元素分配一个记录,然后调整两个连接。在LinkedList的开端增加一个元素的开销是固定的,而在ArrayList的开端增加一个元素的开销是与ArrayList的大小成比例的。 package work; import java.util.*; // 假如有一个列表,要对其进行大量的插入和删除操作 // 以一个极端的例子,重复的在一个列表的开端插入一个元素 public class ListCompare { static final int N=50000; static long timeList(List list){ long start=System.currentTimeMillis(); Object o = new Object(); for(int i=0;i<N;i++) list.add(0, o); return System.currentTimeMillis()-start; } public static void main(String[] args) { System.out.println("ArrayList耗时:"+timeList(new ArrayList())); System.out.println("LinkedList耗时:"+timeList(new LinkedList())); } } |
3 结语
ArrayList和LinkedList在性能上各有优缺点,对于在一列数据的后面添加数据而不是在前面或中间,并且需要随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。对于在一列数据的前面或中间进行新增和删除操作add和remove,并且按照顺序访问其中的元素时,LinkedList比较占优势,因为ArrayList要移动数据。