1. 前言

List实现Collection接口,它的数据结构有序可以重复结合,该结合体系索引;它有三个实现类:ArrayList、LinkList、Vector三个实现类。

2. 三个实现类的基本区别

2.1 ArrayList:

底层数据结构使数组结构查询速度快,增删改慢,

2.2 LinkList

底层使用链表结构增删速度快,查询稍慢;

2.3 Vector:

底层数组结构,Vector线程同步的,所以它也是线程安全的。而ArratList线程异步的,不安全。如果不考虑安全因素,一般用Arralist效率比较高;

可变长度数组不断new数组
(1) ArrayList初始化容量超过10时,会new一个50%de ,把原来的东西放入这150%中;
(2) Vector:当容量超过10时,会new一个100%的浪费内存

3. ArrayList

3.1 ArrayList 概述

① ArrayList是List接口可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法操作内部用来存储列表数组大小

每个ArrayList实例都有一个容量,该容量是指用来存储列表元素数组大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。

③ 注意,此实现不是同步的。如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构修改了列表,那么它必须保持外部同步

3.2 ArrayList的实现:

对于ArrayList而言,它实现List接口底层使用数组保存所有元素。其操作基本上是对数组的操作。下面我们分析ArrayList的源代码底层使用数组实现

Java代码 private transient Object[] elementData;

构造方法
ArrayList提供了三种方式构造器,可以构造一个默认初始容量为10的空列表、构造一个指定初始容量的空列表以及构造一个包含指定collection元素的列表,这些元素按照该collection迭代返回它们的顺序排列的。

4.1 LinkList的概述

LinkedList的本质双向链表

(01) LinkedList继承于AbstractSequentialList,并且实现了Dequeue接口。
(02) LinkedList包含两个重要的成员headersize
header双向链表表头,它是双向链表节点对应的类Entry的实例。Entry包含成员变量previous, next, element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。
size双向表中节点的个数

4.2 LinkList的实现:

LinkedList实际上是通过双向链表去实现的。既然是双向链表,那么它的顺序访问会非常高效,而随机访问效率比较低。


  1. 既然LinkedList是通过双向链表的,但是它也实现了List接口{也就是说,它实现了get(int location)、remove(intlocation)等“根据索引值来获取删除节点的函数”}。LinkedList是如何实现List的这些接口的,如何将“双向链表和索引值联系起来的”?

  2. 实际原理非常简单,它就是通过一个计数索引值来实现的。例如,当我们调用get(int location)时,首先会比较location”和“双向链表长度的1/2”;若前者大,则从链表头开始往后查找,直到location位置;否则,从链表末尾开始先前查找,直到location位置

5. Vector

相对于ArrayList来说,Vector线程是安全的,也就是说是同步
创建了一个向量类的对象后,可以往其中随意地插入不同的类的对象,既不需顾及类型也不需预先选定向量的容量,并可方便地进行查找。对于预先不知或不愿预先定义数组大小,并需频繁进行查找、插入和删除工作的情况,可以考虑使用向量类。向量类提供了三种构造方法

  1. public vector()

  2. public vector(intinitialcapacity,int capacityIncrement)

  3. public vector(intinitialcapacity)

使用第一种方法系统自动向量对象进行管理。若使用后两种方法,则系统将根据参数initialcapacity设定向量对象的容量(即向量对象存储数据大小),当真正存放数据个数超过容量时,系统会扩充向量对象的储存容量。
参数capacityIncrement给定了每次扩充的扩充值。当capacityIncrement为0时,则每次扩充一倍。利用这个功能可以优化存储

原文地址:https://blog.csdn.net/X_islu/article/details/134772028

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_45002.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注