浅浅的阅读一下 ArrayList 的源码
浅浅的阅读一下 ArrayList 的源码
显示代码
// 初始化一个集合
List list = new ArrayList<>();
// 增加元素内容
list.add("好好学习");
主要关注 集合的创建 和 集合add的方法的底层代码逻辑
- 集合的创建
// ArrayList() 的无参构造方法
public ArrayList() {
// 初始化成员变量 elementData (元素数据)
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
// 关注的成员变量
// 底层数组
transient Object[] elementData;
// 初始化数据 长度为 0
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
- 集合开始增加元素
// 第1步方法 进入add泛型方法
public boolean add(E e) {
// 2 进入 ensureCapacityInternal 方法
ensureCapacityInternal(size + 1); // 0 + 1 = 1
elementData[size++] = e;
return true;
}
// size 成员变量
private int size; // 初始化为 0
// 第2步方法 参数 minCapacity = 1
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
// 第3步方法 calculateCapacity
// 参数 Object[] elementData = {} , minCapacity = 1
private static int calculateCapacity(Object[] elementData, int minCapacity) {
// 成立
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// 10 > 1 返回 10
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
// 常量 DEFAULTCAPACITY_EMPTY_ELEMENTDATA
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// 常量 DEFAULT_CAPACITY
private static final int DEFAULT_CAPACITY = 10;
// 第3步方法 参数 minCapacity = 1
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(10);
}
// 第4步方法 参数 minCapacity = 10
private void ensureExplicitCapacity(int minCapacity) {
// 记数器
modCount++;
// 10 - 0 > 0 成立
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
// 第5步方法 grow(10)
private void grow(int minCapacity) {
int oldCapacity = elementData.length; // oldCapacity = 0
// 当数组满时 >> 扩容 1.5 倍
int newCapacity = oldCapacity + (oldCapacity >> 1); // newCapacity = 0 + 0 / 2 = 0
// 0 - 10 < 0 成立
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 0 - 21亿 - 8 不成立
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 参数 elementData = {} newCapacity = 10
elementData = Arrays.copyOf(elementData, newCapacity);
}
// MAX_ARRAY_SIZE 常量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
// 第6步方法 elementData = Arrays.copyOf(elementData, newCapacity);
// 参数 original = elementData newLength = 10
public static T[] copyOf(T[] original, int newLength) {
// 返回新的一个数组
return (T[]) copyOf(original, newLength, original.getClass());
}
以上为代码记录
可通过IDEA调试模式进行更为细致的观看源码的逻辑