Java集合-ArrayList源码解析-JDK1.8
◆
ArrayList简介
◆
ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。
- AbstractList、List提供了添加、删除、修改、遍历等功能。
- RandmoAccess提供了随机访问功能
- Cloneable提供了可以被克隆的功能
- Serializable提供了序列化的功能
- 和Vector不同,ArrayList中的操作不是线程安全的!所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或CopyOnWriteArrayList。
◆
ArrayList的属性
◆
1
|
/**
|
◆
ArrayList的构造方法
◆
1
|
|
◆
ArrayList的方法
◆
接下来我们就以ArrayList的几个比较经典的方法来看一下它是如何设计的。
首先是添加方法,添加的方法一共有3个:
1
|
/**
|
仔细观察上方三个添加的方法,它们都调用了ensureCapacityInternal方法,这个方法的参数是执行当前添加操作所需要的数组容量。它会根据传递的参数来计算数组是否需要扩容,如果需要扩容则完成扩容操作。
不同之处在于,上方的两个方法添加的只有一个元素,所以传的size+1,而addAll因为是添加的一个集合所以传的参数是size+集合的长度。
接着看这个方法的实现:
1
|
/**
|
以上就是ArrayList动态扩容的实现方式了,这里注意一下扩容是通过新建一个数组来替换原先的数组来进行的:
1
|
elementData = Arrays.copyOf(elementData, newCapacity);
|
接下来看删除操作:
1
|
/**
|
需要注意的是删除一个元素也是通过底层的方法实现的。
接着看get和set相对就比较简单了。
1
|
public E get(int index) {
|
看了ArrayList的增删改查方法相信你已经明白了为什么一直有人告诉你ArrayList查询修改效率高而添加和删除效率低了。
ArrayList的序列化方式同样是比较有意思的,一开始看到ArrayList实现了Serializable我们就知道它是可以序列化的,但是实际存储的数组elementData却是transient,观看下方代码你就可以找到答案:
1
|
/**
|
鉴于篇幅有限,本篇文章仅列出上方部分代码,ArrayList完整源码解析请看:https://github.com/shiyujun/syj-study-demo!!!