zoukankan      html  css  js  c++  java
  • 9、集合--ArrayList和LinkedList的一些对比

    ArrayList:顺序存储结构(数组)

    1、ArrayList自己实现了序列化和反序列化的方法,因为它自己实现了 private void writeObject(java.io.ObjectOutputStream s)和

       private void readObject(java.io.ObjectInputStream s) 方法


    2、ArrayList基于数组方式实现,无容量的限制(会扩容)


    3、添加元素时可能要扩容(所以最好预判一下),删除元素时不会减少容量(若希望减少容量,trimToSize()),

      删除元素时,将删除掉的位置元素置为null,下次gc就会回收这些元素所占的内存空间。


    4、线程不安全


    5、add(int index, E element):添加元素到数组中指定位置的时候,需要将该位置及其后边所有的元素都整块向后复制一位


    6、get(int index):获取指定位置上的元素时,可以通过索引直接获取(O(1))


    7、remove(Object o)需要遍历数组


    8、remove(int index)不需要遍历数组,只需判断index是否符合条件即可,效率比remove(Object o)高

    9、contains(E)需要遍历数组

    10、使用iterator遍历可能会引发多线程异常

    LinkedList:(链式存储)是双向列表

    1、LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。

    2、LinkedList 实现 List 接口,能对它进行队列操作。

    3、LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。

    4、LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。

    5、LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。

    6、LinkedList 是非同步的。

    7、LinkedList相对于ArrayList来说,是可以快速添加,删除元素,ArrayList添加删除元素的话需移动数组元素,可能还需要考虑到扩容数组长度。

    8、LinkedList是基于链表实现的,因此插入删除效率高,查找效率低

    9、LinkedList是基于链表实现的,因此不存在容量不足的问题,所以这里没有扩容的方法

    多数情况下如果查询操作较多ArrayList的效果更好.如果删除,插入较多LinkedList的效果较好.

  • 相关阅读:
    [v]Linux下安装Git
    Ubuntu12.04 安装PyCharm
    IE11 Enterprise Mode
    Ubuntu 14.04 安装nVidia驱动后不能进入图形界面的恢复过程
    VirtualBox中安装Ubuntu12.04/Ubuntu14.04虚拟机
    Notepad++配置Python开发环境
    boost 1.56.0 编译及使用
    关于"The dependency was added by the project system and cannot be removed" Error
    [v]Windows下Git安装指南
    Windows开发环境搭建(安装 VS2010, VS2013, VS2015 Community, Windows Server 2008 R2)
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10848882.html
Copyright © 2011-2022 走看看