Java中队列和链表性能对比-ArrayList和LinkedList
本文使用ArrayList和LinkedList,分别对比了队列链表的add,get的性能。
具体代码如下,可以直接运行
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Demo07_list {
public static void main(String[] args) {
List<Integer> link = new LinkedList<Integer>();
List<Integer> list = new ArrayList<>();
Integer m = new Integer(10);
int time1 = (int) System.currentTimeMillis();
for (int i=0;i<1000000;i++){
link.add(m);
}
int time2 = (int) System.currentTimeMillis();
System.out.println(time2 - time1);
int time3 = (int) System.currentTimeMillis();
for (int j=0;j<1000000;j++){
list.add(m);
}
int time4 = (int) System.currentTimeMillis();
System.out.println(time4 - time3);
/**
* 像上面这种for循环逐个新增,其实link和list效率差别不大。link有底层维护可以直接找到的lastnode,list可以直接index找到last
* link效率高的地方是insert,只需要挪动一个;list需要所有挪动
*
*/
time1 = (int) System.currentTimeMillis();
for(int i=0;i<1000000;i++){
link.get(i);
}
time2 = (int) System.currentTimeMillis();
System.out.println(time2 - time1);
time3 = (int) System.currentTimeMillis();
for (int j=0;j<1000000;j++){
list.get(m);
}
time4 = (int) System.currentTimeMillis();
System.out.println(time4 - time3);
/**
* get的时候每次获取,link都需要从头遍历;list只需要index就可以找到对应的元素
*
*/
}
}
最终输出结果
16 11 340337 3
其中get耗时较久。最终结果如同上一篇博客中提到的两者差距(但是其实实际结果add的时候,性能差别不是特别大,可以是因为数据类型的问题)
|
底层结构 |
增删效率 |
改查的效率 |
|
|
ArrayList |
可变数组 |
较低,通过数组扩容 |
较高,不需要改变数组 |
|
LinkedList |
双向链表 |
较高,通过链表追加 |
较低,需要通过node一个个遍历找到后操作 |
如何选择?
- 如果改查操作较多,选择ArrayList
- 如果增删操作较多,选择LinkedList
- 一般来说在程序中大多数都是查询,因此大部分情况下会选择ArrayList
- 不适合用于多线程,LinkedList和ArrayList的线程不是安全的
备注:
为什么node删除总是可以找到最后一个?
node底层实际上维护了一个双向链表,看源码native修饰的node属性的对象,这就是指向的last node。

浙公网安备 33010602011771号