目录
3.2 LinkedList相对于ArrayList的优缺点详解
1. 线性表
✍线性表是最基本、最简单、也是最常用的一种数据结构。线性表是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。线性表就像是用一根绳子将我们的数据串起来存储到我们的内存中,并且线性表有且仅有一个开始结点和终端结点,开始结点没有前驱元素的且只有一个后驱元素,终端结点没有后驱元素且只有一个前驱元素,其他的结点有且只有一个前驱元素和后驱元素。
线性表以顺序存储的结构就叫顺序表
线性表以链式存储的结构就叫链表
在java当中 ArrayList 这个类实现了动态类型的顺序表,LinkedList 这个类实现了链表,他们都继承与 List
2. 顺序表
✍顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
顺序表的每个元素在存储的地址是连续的,如果有一个整型数组,那每个元素之间的地址都相差4
2.1 动态扩容
数组是一个静态的顺序表,当我们创建一个数组时,给定一个大小,那么这个数组的大小时不能更改的了,例如我们定义一个可以存放十个整型的大小
如果你已经存放了十个元素,当你想要继续存储第十一个元素的时候必须要重新创建一个大小为11的数组,将原来的数组放入到新数组内然后对新数组进行添加元素
👀而我们的 ArrayList 是一个动态类型的顺序表,他可以进行动态的扩容 ,当我们的顺序表内元素放满后,如果想要添加新的元素他会动态扩容至原来大小的 1.5 倍
接下来让我们来看看他的底层是如何进行扩容的
首先我们创建一个 ArrayList 对象
当一个类实例化的一个对象后,那么他肯定是要调用他的构造方法的,我们先来看看他的构造方法
先来看看不带参数的构造方法
看到这俩个参数 elementData 和 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 后一脸懵逼,这俩是啥❓❓
先来看看 elementData
是一个Object 类型的数组,我们存放的元素就在这个数组当中。
再来看看 DEFAULTCAPACITY_EMPTY_ELEMENTDATA
DEFAULTCAPACITY_EMPTY_ELEMENTDATA 也是一个数组,指向的对象 {} 内没有任何东西,此时并没有给 elementData 分配内存。
❓问题来了,如果 elementData 并没有给他初始化大小那我们怎么放元素进去呢,或者说放元素进去会发生什么❓