List以及其实现类(ArrayList、LinkList、Vector)简介

  • List
    • 本身是一个接口,实现了Collection接口,而Collection接口又继承了Iterable类,所以他的数据结构是有序可以重复的结合,并且可以迭代
    • 包涵一些基础的方法,不一一列举
  • 三个实现类(ArrayList、LinkList、Vector)
    • ArrayList
      • 1.概述:ArrayList是List接口的可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
      • 2.相关方法
        • 构造方法: ArrayList提供了三种方式的构造器
          • 1.构造一个默认初始容量为10的空列表
          • 2:构造一个指定初始容量的空列表
          • 3:构造一个包含指定collection的元素的列表,这些元素按照该collection的迭代器返回它们的顺序排列的。
        • 存储方法
List以及其实现类(ArrayList、LinkList、Vector)简介_第1张图片

    • 还有一些相关的读取与删除\扩容等方法,不再一一列举
  • 3.底层数据结构:维护的是一个Object数组
List以及其实现类(ArrayList、LinkList、Vector)简介_第2张图片
    • 4.线程不安全
    • 5.查询速度快,增加删除慢
    • 6.当容量超过10后(因为默认的初始容量为10),会创建一个新的数组(新数组的容量是原数组的150%),并将原本的数组复制到该数组中,完成扩容..( 每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。 )
List以及其实现类(ArrayList、LinkList、Vector)简介_第3张图片
  • 在源码中,计算原本容量的一半,是通过右移实现的
  • 在grow()方法中进行扩容
  • 源代码如下
List以及其实现类(ArrayList、LinkList、Vector)简介_第4张图片
  • LinkList
    • 1.底层维护的是一个链表,并且是一个双向链表,所以顺序访问会非常高效,随机访问效率低。
    • 2.使用Node类型的结点表示链表的相关信息(以前是使用的Entry),Node为LinkList的一个内部类
List以及其实现类(ArrayList、LinkList、Vector)简介_第5张图片
    • 3.因为是链表不存在LinkedList容量不足的问题,除非内存不足。
    • 4.增删速度快,查询速度慢
  • Vector
    • 1.底层维护的是一个Object数组结构
List以及其实现类(ArrayList、LinkList、Vector)简介_第6张图片
    • 2.线程安全,会发生并发问题的方法都用了synchronize修饰
    • 3.没有ArrayList的效率高,因为同步会进行上下文切换,这也会导致cpu资源的消耗
    • 4.当容量超过10后(因为默认的初始容量为10),会创建一个新的数组(新数组的容量是原数组的200%),并将原本的数组复制到该数组中,完成扩容..所以Vector比ArrayList更消耗内存.
      • 在源码中是通过相加两个当前容量来定义新数组的容量的
      • 在grow()方法中进行扩容
      • 源代码
List以及其实现类(ArrayList、LinkList、Vector)简介_第7张图片
    • ArrayList与Vector
      • 1.Vector是线程同步的,所以它也是线程安全的。而ArratList是线程异步的,不安全.所以ArrayList效率比较高。如果不考虑安全因素,一般用Arralist,,如果在多线程环境下最好使用Vector。
      • 2.Vector在容量不足时,以原数组100%的容量扩容,而ArrayList是按照原数组的50%容量扩容,所以在数据量比较大的时候使用Vector比较好,可以建设扩容 次数。

你可能感兴趣的:(Java)