在看到这个问题时 ,我的第一反应就是LinkedList要快。通常我们所知道的关于ArrayList和LinkedList的区别就在与它们的实现方式不同导致的性能不同,ArrayList随即访问快,插入删除慢;LinkedList随即访问慢,插入删除快。
不过经过更细致深入的学习后,对两者有了更深的理解。
ArrayList:内部使用数组的形式实现了存储,实现了RandomAccess接口,利用数组的下标进行元素的访问,因此对元素的随机访问速度非常快。但在从ArrayList中插入和删除元素时,移动变更位置之后的所有元素,所以插入和删除较慢。
但是,如果修改位置越靠前,需要位移的元素越多,开销越大,相反,修改位置越靠后的话,开销就越小了,如果在最后面进行插入,那就不需要进行位移;
LinkedList:内部使用双向链表的结构实现存储,LinkedList内部有一个header属性,用来标识起始位置,LinkedList的第一个单元和最后一个单元都会指向header,因此形成了一个双向的链表结构。也正因为这样,LinkedList的随机访问速度惨不忍睹,因为无论你要访问哪一个元素,都需要从header起步正向或反向(根据元素的位置进行的优化)的进行元素遍历。
对ArrayList和LinkedList塞入上万个元素,或在指定位置连续插入元素。指定位置从头部开始逐步后移,ArrayList消耗的时间越来越短;
LinkedList插入元素是需要先进行元素的查找定位,然后才能进行首尾链接的拆分、重新指向新元素的,然而LinkedList的遍历有多低效,大家也是清楚明白的。
package test;
import java.util.ArrayList;
import java.util.LinkedList;
/**
*
* Title:AddTime
* Description:arraylist和linkedlist添加元素速度对比
* @author LeslieTian
* @date 2018-10-14 下午5:12:32
* @version 1.0
*/
public class AddTime {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
LinkedList linkedList = new LinkedList();
long ArrStart = System.currentTimeMillis();//获取ArrayList循环开始前时间
for(int i=0;i<10000;i++){
arrayList.add(i);
}
long ArrEnd = System.currentTimeMillis();//获取ArrayList循环结束的时间
long LinkStart = System.currentTimeMillis();//获取LinkedList循环开始前时间
for(int j = 0;j<10000;j++){
linkedList.add(j);
}
long LinkEnd = System.currentTimeMillis();//获取LinkedList循环结束的时间
if((ArrEnd-ArrStart)>(LinkEnd-LinkStart)){//时间对比
System.out.println("ArrayList慢");
}else {
System.out.println("LinkedList慢");
}
}
}
输出:LinkedList慢所以说ArrayList对越靠近尾部的元素进行增删时效率其实要比LinkedList要高。
No comments:
Post a Comment