02.03 ArrayList 源码解析之架构

对于每一个开发者来说,ArrayList每天我们都会使用到,但是讨论到底层原理,有不少人对源码的细节不了解,这样在使用时会遇到瓶颈。本节就和大家一起探讨ArrayList整体架构。

1.ArrayList架构

ArrayList的架构比较简单,是一个数组结构,如下图:

ArrayList 源码解析之架构

ArrayList架构图

上图是一个长度为10的数组,从1开始计数。index表示数组的下标,从0开始计数。element是数组元素本身。

ArrayList 源码解析之架构

ArrayList整体类图

上图是ArrayList类图,从图中可以清楚的看到ArrayList的继承依赖关系。

ArrayList的其他特性

  • DEFAULT_CAPACITY 表示数组的初始化大小,默认是10,如下图:
ArrayList 源码解析之架构

ArrayList默认大小(源码)

  • modCount 统计当前数组被修改的版本次数,如果数组结构有变动,modCount +1,如下图:
ArrayList 源码解析之架构

modCount (源码)

modCount在ArrayList中执行++操作发生在很多处,即只要数组结构有变动,modCount就会+1,modCount定义在ArrayList继承的AbstractList类里面,如下图:

ArrayList 源码解析之架构

modCount定义(源码)

从上图中可以看到,modCount的定义就是为了检测数组结构变化的,如果你细心点可以发现modCount使用了关键字transient修饰,这里对transient进行一下扫盲。

transient关键字我们常用来修饰类变量,意思是当前变量是无需进行序列化的。在序列化时,就会忽略该变量,这些在序列化工具底层,就已经对 transient 进行了支持

  • size 表示当前数组的大小,如下图:
ArrayList 源码解析之架构

size大小(源码)

size是ArrayList的大小,它包含的是元素的数量。

2.数组

因为在ArrayList架构的底层就是数组,所以在这里对数组这种数据结构做一个简单的介绍

数组这种数据结构相信你不管接触哪种编程语言,数组都是你要学习的一种数据结构。相对于其他数据结构,数组也是比较简单的一种数据结构,但是如果我们从原理上去研究数组,数组是有很多设计理念值得我们去研究的。

数组特性:

数组的下标是以0开始的,既数组中第n个元素的下标是n-1。如下图所示:

ArrayList 源码解析之架构

数组结构

Java中数组的简单使用:

下面介绍在Java中数组的简单使用,如下图:

ArrayList 源码解析之架构

Java中数组的简单使用

在实际的使用中,数组的所以可以分为两类:

有语意的索引:

数组的索引代表实际的业务意义;

无语意的索引:数组的索引只是简单的下标,没有实际的业务意义。

其实大部分人在实际开发中,基本上不会去考虑数据是不是有语意,只是简单的使用。我们知道,数组的最大优点就是能够快速定位查询,但是快速查询的基础就是使用索引。所以,在实际的使用中,最好使用数组有语意的场景。如果使用有语意数组解决不了当前问题,那么可能选择其他的数据结构会是更好的选择。

本节主要分享了ArrayList的整体架构,考虑到我们看文章基本都是手机端,所以对于文章的篇幅我都不会写特别长,每一个知识点都会分为几个篇幅去分享,最后形成系列性文章。了解更多文章欢迎关注微信公众号《编程之艺术》。


分享到:


相關文章: