集合家族——List集合汇总

一、概述

  List继承了Collection,是有序的列表。

  可重复数据

  实现类有ArrayList、LinkedList、Vector、Stack等

    1. ArrayList是基于数组实现的,是一个数组队列。可以动态的增加容量!
    2. LinkedList是基于链表实现的,是一个双向循环列表。可以被当做堆栈使用!
    3. Vector是基于数组实现的,是一个矢量队列,是线程安全的!
    4. Stack是基于数组实现的,是栈,它继承与Vector,特性是FILO(先进后出)

二、情景使用

  1. 当集合中对插入元素数据的速度要求不高,但是要求快速访问元素数据,则使用ArrayList!
  2. 当集合中对访问元素数据速度不做要求不高,但是对插入和删除元素数据速度要求高的情况,则使用LinkedList!
  3.当集合中有多线程对集合元素进行操作时候,则使用Vector!但是现在BVector现在一般不再使用,如需在多线程下使用,可以用CopyOnWriteArrayList,在java.util.concurrent包下。
  4.当集合中有需求是希望后保存的数据先读取出来,则使用Stack!

三、各自简介

  3.1 ArrayList 

    ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数 组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进 行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除,线程不安全。 

  3.2 LinkedList

    LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较 慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆 栈、队列和双向队列使用。 增删效率较高,查询效率较低,线程不安全

  3.3 Vector

    Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一 个线程能够写 Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此, 访问它比访问ArrayList慢。 查询效率较高,增删效率较低,线程安全。

  3.4 Stack

    后进先出(LIFO)的对象堆栈。继承了Vector ,也是一个数组。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。

四、分方面比较

  4.1.底层数据结构

    ArrayList、Vector底层依赖数组,查询效率较高,增删效率较低(因为Vector是线程安全的,整体效率比ArrayList低)

    LinkedList底层依赖双向循环链表,增删效率较高,查询效率较低

  4.2.存储元素方面

    ArrayList、Vector、LinkedList中的元素有序、可重复、允许null值

  4.3.扩容方面

    ArrayList一次扩容1.5倍

    Vector根据增量扩容,增量为0,扩容2倍;否则原容量+增量

    LinkedList没有扩容

  4.4.线程安全方面

    ArrayList、LinkedList线程不安全(如果有多个线程需要同时访问List集合中的元素,可以考虑使用Collections将集合包装成线程安全的集合)

    Vector线程安全


五、面试题

  5.1 ArrayList与Vector的异同:

  

    补:都支持fail-fast机制

  5.2  ArrayList与LinkedList的异同

  1. 两者都是List接口的实现类
  2. ArrayList是基于动态数组的数据结构,而LinkedList是基于链表的数据结构
  3. 对于随机访问get和set(查询操作),ArrayList要优于LinkedList,因为LinkedList要移动指针
  4. 对于增删操作(add和remove),LinkedList优于ArrayList

猜你喜欢

转载自www.cnblogs.com/xiao-ran/p/11909322.html