zoukankan      html  css  js  c++  java
  • ArrayList和LinkedList

    ArrayList和LinkedList都实现了List接口,区别在于它们存储的数据结构不同,它们都是线性存储结构,单ArrayList属于顺序式存储而LinkedList属于链式存储:

    它们的大致区别是:

    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
    2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
    3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

    4.ArrayList每次add添加的对象后,取出来属于一个Object类型的数据。而LinkedList每次add添加元素之后,实际则是添加了一个Entry对象,Entry对象结构如下:

    {

    Entry previous;//指向上一个元素的索引
    Object element;//本元素的具体数据
    Entry next;//指向下一个元素的索引

    }

    测试程序:


    import java.util.LinkedList;
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Collections;

    public class ListTest

    {
        public static void main(String[] args)
        {
             List<String> list = new ArrayList<String>();
             
             for(int i=0;i<5000;i++)
             {
                 list.add("Test"+i);
             }
             System.out.println("ArrayList查找最后一个元素耗时:"+timeList(list,"Test4999"));
             
             List<String> list1 = new LinkedList<String>();
             
             for(int i=0;i<5000;i++)
             {
                 list1.add("Error"+i);
             }
             System.out.println("LinkedList查找最后一个元素耗时:"+timeList(list1,"Error4999"));
        }

         static long timeList(List<String> lst,String str)
            {
             long start=System.currentTimeMillis();

             for(int i=0;i<5000;i++)

              {
                Collections.binarySearch(lst, str);
              }
             return System.currentTimeMillis()-start;
         }
    }

    多次测试结果如下:

    ArrayList查找最后一个元素耗时:5
    LinkedList查找最后一个元素耗时:579

    ----------------------------------------------------------

    ArrayList查找最后一个元素耗时:7
    LinkedList查找最后一个元素耗时:341

    ----------------------------------------------------------

    ArrayList查找最后一个元素耗时:6
    LinkedList查找最后一个元素耗时:339

    总结:查找过程中由于LinkedList是链式的,所以每次查找都从第一个索引开始,但是ArrayList可以直接指向其中的索引。这就是两者最大的不同之处。配合上上面三条,两种继承于List接口的类操作的范围就要根据实际情况而确定。与常规的数组不同,常规的数组一般定义的时候需要直接定义数组的大小,那么数组在内存中的大小就是固定的,而继承于List接口的集合类,如(ArrayList和LinkedList)你,你可以不定义它的大小,它们在内存中的大小也不固定,如果利用它们默认的构造方法,new出来一个,那么默认它们的容量是10,也就是它们的索引最大为9;如果超过了这个初始值,它们扩充大小,但是每次扩充的范围有规律,譬如如下扩充过程:10->16->25->38->58->88->...

    那么就可以认为大致规律如下:新容量=旧容量*(3/2)+1



  • 相关阅读:
    土木工程材料0732
    07 具有无关项的逻辑函数及其化简
    06 逻辑函数化简法
    AD中板子挖孔开槽
    电容式触摸按键原理
    LTspice
    三相电
    7、简单电阻容元件模型的创建
    cadence17.4在笔记本下设置菜单显示不全的解决办法
    36. 二叉搜索树与双向链表
  • 原文地址:https://www.cnblogs.com/MedivhQ/p/3801446.html
Copyright © 2011-2022 走看看