zoukankan      html  css  js  c++  java
  • arrayList 和 linkedList 的区别

    ArrayList、LinkedList、Vector 区别,优缺点,实现原理

    从图中可以看出:Vector、ArrayList、LinkedList这三者都实现了List 接口.所有使用方式也很相似,主要区别在于实现方式的不同,所以对不同的操作具有不同的效率。

      • ArrayList 就是动态数组,是Array的复杂版本,动态的增加和减少元素.当更多的元素加入到ArrayList中时,其大小将会动态地增长。它的元素可以通过get/set方法直接访问,因为ArrayList本质上是一个数组。
      • Vector 和ArrayList类似, 区别在于Vector是同步类(synchronized).因此,开销就比ArrayList要大。
      • LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比。它还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.

    注意: 默认情况下ArrayList和Vector的初始容量都是10,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。

     

    接下来将Vector 和ArrayList 、 ArrayList和LinkedList进行两两对比

    ArrayList和Vector

        先看一下构造方法

    public Vector(int paramInt1, int paramInt2) //使用指定的初始容量和容量增量构造一个空的向量

    public Vector(int paramInt) //使用指定初始容量其标准容量增量为零的空向量

    public Vector() //使用指定的初始容量为10和容量增量为零的空向量

    public Vector(Collection<? extends E> paramCollection) //构造一个包含指定 collection 中的元素的向量

    public ArrayList(int paramInt) //构造一个具有指定初始容量的空列表
    public ArrayList() //构造一个初始容量为10的空列表
    public ArrayList(Collection<? extends E> paramCollection) //构造一个包含指定 collection 的元素的列表


        

    1、ArrayList在内存不够时默认是扩展50% + 1个;Vector是当增长因子>0,默认扩展增加一个增长因子,否则默认扩展1倍。

    当更多的元素被添加的时候,Vector和ArrayList需要更多的空间。Vector每次扩容会增加一倍的空间,而ArrayList增加50%。

    2、Vector的方法加了synchronized, 而ArrayList则没有。Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销

     

    LinkedList和ArrayList的区别

    LinkedList和ArrayList的差别主要来自于ArrayList和LinkedList数据结构的不同:

    1) 因为ArrayList是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。

      ArrayList获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。

    2) 相对于ArrayList,LinkedList插入是更快的。

      因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,

      这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。

      ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。

    3) 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

    4) LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,

      而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。

            

  • 相关阅读:
    Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
    控制‘控制台应用程序’的关闭操作
    详解for循环(各种用法)
    敏捷软件开发
    Sql Server的一些知识点
    在SharePoint 2010 中配置Remote Blob Storage FILESTREAM Provider
    使用LotusScript操作Lotus Notes RTF域
    JOpt Simple 4.5 发布,命令行解析器
    John the Ripper 1.8.0 发布,密码破解工具
    PacketFence ZEN 4.0.1 发布,网络接入控制
  • 原文地址:https://www.cnblogs.com/wzf123/p/12906913.html
Copyright © 2011-2022 走看看