大数据量ArrayList与LinkedList对比
前言
一般的认知里,都认为ArrayList查询效率高、LinkedList增删效率高,但是在大数据量情况下还是这样吗?
注:测试时虚拟机初始内存和最大内存都设置了4GB,给足空间以防GC发生对结果造成影响
添加
ArrayList测试
public class Demo1 { public static void main(String[] args) throws InterruptedException { ArrayList<Integer> arrayList = new ArrayList<>(); //LinkedList<Integer> linkedList = new LinkedList<>(); Integer integer = new Integer(100); long start = System.currentTimeMillis(); for (int i = 0; i < 50000000; i++) { arrayList.add(integer); } long end = System.currentTimeMillis(); System.out.println("linkedList添加五千万条数据所用时间:" + (end - start) + " ms"); Thread.sleep(4000000); } }
测试结果
时间:599ms
扩容时产生数组对象占用800MB
如果在创建ArrayList时指定了大小
ArrayList<Integer> arrayList = new ArrayList<>(50000000);
运行时间只有225 ms,且内存占用更小
LinkedList测试
public class Demo1 { public static void main(String[] args) throws InterruptedException { //ArrayList<Integer> arrayList = new ArrayList<>(); LinkedList<Integer> linkedList = new LinkedList<>(); Integer integer = new Integer(100); long start = System.currentTimeMillis(); for (int i = 0; i < 50000000; i++) { linkedList.addFirst(integer); } long end = System.currentTimeMillis(); System.out.println((end - start) + " ms"); Thread.sleep(4000000); } }
测试结果
linkedList添加五千万条数据所用时间:2485ms
注:内存中创建了50000000个Node对象,占用为1200MB
其他操作
按照这个环境对增删改查都进行了测试,结果总结如下:
ArrayList | LinkedList | |
---|---|---|
插头 | 超过10000ms | 2814 |
插中间 | 超过10000ms | 超过10000ms |
插尾 | 599(225) | 2830 |
查头 | 0 | 0 |
查中间 | 0 | 超过10000ms |
查尾 | 0 | 0 |
头查到尾 | 0 | 超过10000ms |
删头 | 超过10000ms | 204 |
删中间(1次) | 16 | 62 |
删尾 | 63 | 203 |
改头 | 15 | 0 |
改中间 | 15 | 超过10000ms |
改尾 | 15 | 15 |
总结
在超大数据量情况下,如果不是针对头部增删的操作,ArrayList的效率要比LinkedList高。