今天不学习,明天变垃圾
线性表是集合中的每个元素间有线性关系且是顺序存储的一种数据结构。有线性关系的顺序存储结构又分为逻辑上的顺序存储结构(比如链表)和物理上的顺序存储结构(比如顺序表),本章篇幅中着重讲解顺序表。
什么是顺序表?
顺序表是为了解决数组内存利用率低下而被设计出来的一种数据结构,它所有元素按照一定的循序存储到内存中某一块连续存储空间中,并且元素与元素之间不允许有空值。
下面具体来研究顺序表ArrayList 的具体实现。
ArrayList继承关系
ArrayList继承AbstractList,并实现List、RandomAccess(随机存储)、Cloneable(克隆)、Serializable(序列化)接口。因此它具备List接口所有功能,具体如上图所示。
ArrayList构造函数分析
从上述源码可以看出,ArrayList 底层是用数组保存数据,并且这个数组在声明ArrayList 的时候就已经赋值一个空数组。当然还有一种指定数组长度的初始化方式。
ArrayList 数据操作方式分析
-
增。 ArrayList 添加数据有队尾添加和非队尾添加两种区别,当然还有数组扩容这一重要内容。
-
数据扩容。
由上面两张图中可以看出,当数组是一个长度为0的空数组时,会重新初始化一个长度为10的数组,后续需要扩容每一次都增长为原先数组长度的1.5倍。
-
队尾添加。
判断数组长度和数组扩容后,往队尾 size 处添加数据,添加完后数组长度加一.。
-
非队尾添加。
需要注意的是:使用该方法添加数据,需要判断数组越界问题。从源码可以看出,插入数据之前需要使用arraycopy 复制移动数据,把从index位置开始到队尾的数据复制并且往后移动一位,把index位置空出来后插入新数据。
-
-
删。 ArrayList 删除数据有两种方式,一种是直接根据下标删除。另外一种是根据具体数据去删除。
-
根据下标删除。
先判断数组越界,接下来把index后面的数据复制往前移动一位,并把ArrayList size减一,队尾数据置空。
-
根据数据删除。 需要循环遍历数组,找到数据下标,接下来根据下标删除。可以看出这种方式效率比较低。
-
-
改。 ArrayList 支持随机访问,存取效率非常高。
-
查。 ArrayList 支持随机访问,访问效率非常高。
经过上述分析,相信各位已经非常清楚明白ArrayList 的优缺点所在。
-
优点
- 存储空间连续,支持随机访问,读取效率非常高。
- 队尾增加删除效率高。
-
缺点
- 线性存储结构,存储空间连续。
- 非队尾的增加删除操作需要大量arraycopy操作,效率非常低下。
适用场景: ArrayList 适用于数据读取修改且没有大量增删操作场景。比如数据库中读取数据展示。
不适用场景: 不适用于有大量增删操作场景。比如数据库读取数据后需要排序。