本文使用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。
标签:node,util,Java,LinkedList,ArrayList,链表,new From: https://www.cnblogs.com/cccrush/p/16747320.html