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号