前言
网上关于该测试的文章已经很多了,本文仅当个人记录。
正文
尾部插入数据:
@Test
public void test1(){
List list1 = new ArrayList();
List list2 = new LinkedList();
Long time = System.currentTimeMillis();
for (int i=0; i < 9999999; i++){
list1.add(1);
}
Long nowTime = System.currentTimeMillis();
System.out.println("ArrayList:" + (nowTime - time));
for (int i=0; i < 9999999; i++){
list2.add(1);
}
time = System.currentTimeMillis();
System.out.println("LinkedList:" + (time - nowTime));
}
测试结果:
ArrayList:103
LinkedList:1582
可以看出,如果都在序列的尾部添加数据,那么链表的优势就发挥不出来,以至于ArrayList的插入效果优于LinkedList。
随机位置插入(此处就测试都在头部插入):
@Test
public void test2(){
List list1 = new ArrayList();
List list2 = new LinkedList();
Long time = System.currentTimeMillis();
for (int i=0; i < 55555; i++){
list1.add(0,1);
}
Long nowTime = System.currentTimeMillis();
System.out.println("ArrayList:" + (nowTime - time));
for (int i=0; i < 55555; i++){
list2.add(0,1);
}
time = System.currentTimeMillis();
System.out.println("LinkedList:" + (time - nowTime));
}
测试结果:
ArrayList:192
LinkedList:4
毫无疑问,LinkedList在随机插入的时候速度碾压ArrayList。
原因是在ArrayList的头部插入一个元素,其余元素都要向数组的后端移动,而链表只要更新新元素附近的元素的节点引用即可。
总结
如果不涉及到指定位置添加数据,而都是在序列末尾添加的话,使用ArrayList的效果似乎还优于LinkedList,反之则LinkedList的效果更优。