• 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




  • 相关阅读:
    Python 之 raw_input()与input()区别
    Python基础语法
    在Cloudera Hadoop CDH上安装R及RHadoop(rhdfs、rmr2、rhbase、RHive)
    MapReduce 过程详解
    Cloudera Manager and CDH安装及配置
    RFC 目录
    聊一聊 tcp拥塞控制 九 fack
    聊一聊tcp 拥塞控制 八 相关数据结构&& 概念
    聊一聊 tcp 拥塞控制 七 转载
    udp connected socket
  • 原文地址:https://www.cnblogs.com/MedivhQ/p/4074991.html
Copyright © 2020-2023  润新知