zoukankan      html  css  js  c++  java
  • ArrayList和LinkedList的区别

    一般大家都知道ArrayList和LinkedList的大致区别:
    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
    2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
    3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
        这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。  这一点我做了实验。在分别有200000条“记录”的ArrayList和LinkedList的首位插入20000条数据,LinkedList耗时约是ArrayList的20分之1。

    for(int m=0;m<20000;m++){
            linkedlist.add(m,null);      //当在200000条数据之前插入20000条数据时,LinkedList只用了1125多ms.这就是LinkedList的优势所在
            }
            long time4 = new Dte().getTime();
            System.out.print("batch linkedlist add:");
            System.out.println(time4 - time3);
            for(int n=0;n<20000;n++){
            arraylist.add(n, null);  //当在200000条数据之前插入20000条数据时,ArrayList用了18375多ms.时间花费是arraylist的近20倍(视测试时机器性能)
            }
            long time5 = new Date().getTime();
            System.out.print("batch arraylist add:");
            System.out.println(time5 - time4);


    4.查找操作indexOf,lastIndexOf,contains等,两者差不多。
    5.随机查找指定节点的操作get,ArrayList速度要快于LinkedList.
    这里只是理论上分析,事实上也不一定,ArrayList在末尾插入和删除数据的话,速度反而比LinkedList要快。我做过一个插入和删除200000条数据的试验。

            long time1 = new Date().getTime();
            String s1 = (String) linkedlist.get(100000);//  总记录200000,linkedlist加载第100000条数据耗时15~32ms不等
            long time2 = new Date().getTime();
            System.out.println(time2 - time1);
            String s2 = (String) arraylist.get(100000);//  总记录200000,linkedlist加载第100000条数据耗时0ms
            long time3 = new Date().getTime();
            System.out.println(time3 - time2);
        /*分别insert200000条数据到linkedlist和arraylist
        *由于是在末尾插入数据,arraylist的速度比linkedlist的速度反而要快 
        */
        public static void insertList(LinkedList linklist, ArrayList arraylist) {
            long time1 = new Date().getTime();
            System.out.println(time1);
            for (int i = 0; i < 200000; i++) {
                linklist.add(i, "linklist" + i);
            }
            long time2 = new Date().getTime();
            System.out.println(time2 - time1);
            for (int j = 0; j < 200000; j++) {
                arraylist.add(j, "arraylist" + j);
            }
            long time3 = new Date().getTime();
            System.out.println(time3 - time2);
        }


    /*delete linkedlist和arraylist中的200000条数据
        *由于是在末尾删除数据,arraylist的速度比linkedlist的速度反而要快 
        */
        public static void deleteList(LinkedList linklist, ArrayList arraylist) {
            long time1 = new Date().getTime();
            System.out.println(time1);
            for (int i = 199999; i >= 0; i--) {
                linklist.remove(i);
            }
            long time2 = new Date().getTime();
            System.out.println(time2 - time1);
            for (int j = 199999; j >= 0; j--) {
                arraylist.remove(j);
            }
            long time3 = new Date().getTime();
            System.out.println(time3 - time2);
        }

        public static void main(String args[]) {
            LinkedList linkedlist = new LinkedList();
            ArrayList arraylist = new ArrayList();
            insertList(linkedlist, arraylist);

                                            //以下代码省略

    插入:
    LinkedList 578ms
    ArrayList 437ms
    删除:
    LinkedList 31ms
    ArrayList 16ms

  • 相关阅读:
    UVA 408 (13.07.28)
    linux概念之用户,组及权限
    Java实现 蓝桥杯 历届试题 网络寻路
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 九宫重排
    Java实现 蓝桥杯 历届试题 九宫重排
  • 原文地址:https://www.cnblogs.com/dixinyunpan/p/5864527.html
Copyright © 2011-2022 走看看