ArrayList和LinkedList区别及性能测试

Isleta ·
更新时间:2024-11-15
· 587 次阅读

  ArrayList和LinkedList是Java Lis接口的2个实现。它们的区别如下表所示:

  那么它们在不同场景中的性能究竟有多大差别,我们来实测一下。   测试环境:联想G50-70/INTEL CORE I7-4510U 双核4线程/WIN8.1 64bit。   测试程序:ListPerformanceTest.java package Colloections; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; public class ListPerformanceTest { public static void main(String[] args) { // TODO Auto-generated method stub ListPerformanceTest listPerformanceTest = new ListPerformanceTest(); listPerformanceTest.LinkedListPerformanceTest(50000); listPerformanceTest.arrayListPerformanceTest(50000); } public void listPerformanceTest(List<Integer> list){ int size = list.size(); long startTime = System.currentTimeMillis(); for (int i = 0; i < size; i++) { list.get(i); } System.out.printf("%s: get element cost %d ms.%n", list.getClass().toString(), System.currentTimeMillis() - startTime); startTime = System.currentTimeMillis(); for (int i = 0; i < size; i++) { list.add(size, i);//add a element at designated position } System.out.printf("%s: add element cost %d ms.%n",list.getClass().toString(),  System.currentTimeMillis() - startTime); } public void LinkedListPerformanceTest(int size){ List<Integer> linkedList = new LinkedList<Integer>(createIntegerList(size)); listPerformanceTest(linkedList); } public void arrayListPerformanceTest(int size){ List<Integer> arrayList = new ArrayList<Integer>(createIntegerList(size)); listPerformanceTest(arrayList); } public List<Integer> createIntegerList(int size){ //construct a Integer list, but it is not a arrayList,is not allowed to add(),remove,etc Integer [] array = new Integer[size]; for (int i = 0; i < size; i++) { array[i] = i; } return Arrays.asList(array); } }   输出如下:   class java.util.LinkedList: get element cost 936 ms.   class java.util.LinkedList: add element cost 2244 ms.   class java.util.ArrayList: get element cost 1 ms.   class java.util.ArrayList: add element cost 186 ms.   咦,不是说LinkedList对于插入删除操作很快么,为什么测出来还要比arrayList慢那么多?   仔细看listPerformanceTest函数,我们将其中的add方法调用进行如下修改:   for (int i = 0; i < size; i++) {   list.add(0, i);//add a element at designated position   }   输出如下:   class java.util.LinkedList: get element cost 940 ms.   class java.util.LinkedList: add element cost 5 ms.   class java.util.ArrayList: get element cost 1 ms.   class java.util.ArrayList: add element cost 641 ms.   这个结果与表1吻合了。测试结果表明,LinkedList进行add操作时,其性能与元素所在的位置有很大关系。由于链表无法进行随机访问,因此操作指定位置的元素时,都必须从首元素开始遍历,也是说,如果指定元素的位置越靠后,则操作越耗时,越靠前则越省时。当然,remove操作也是一样的。因此,ArrayList与LinkedList的性能孰优孰劣不能一概而论,要视具体元素的分布而定。Java Tutorial原文写道:如果你决定使用LinkedList,在做决定之前请使用ArrayList和LinkedList分别测试你的应用程序,一般ArrayList要更快一些。



性能 arraylist 性能测试 测试

需要 登录 后方可回复, 如果你还没有账号请 注册新账号