ArrayList源码解析

发布 : 2019-04-24 分类 : java 浏览 :

核心点

1
2
3
4
5
6
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;

transient Object[] elementData; // non-private to simplify nested class access

初始大小是10。如果你没有给他初始化大小的话。

  • 构造函数:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
    this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
    this.elementData = EMPTY_ELEMENTDATA;
    } else {
    throw new IllegalArgumentException("Illegal Capacity: "+
    initialCapacity);
    }
    }

这里初始化好两个空的列表,如果初始化大小是0,直接用,减小构造成本。

  • 入队
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}

private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
}
private Object[] grow(int minCapacity) {
return elementData = Arrays.copyOf(elementData,
newCapacity(minCapacity));
}

private Object[] grow() {
return grow(size + 1);
}

这里分几个步骤:
1、看看是否需要grow,需要的话grow
2、grow做的事就是调用System.copy,这个是native方法。扩容的大小是size+1
3、放入元素。

本文作者 : braveheart
原文链接 : https://zhangjun075.github.io/passages/ArrayList源码解析/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

知识 & 情怀 | 二者兼得

微信扫一扫, 向我打赏

微信扫一扫, 向我打赏

支付宝扫一扫, 向我打赏

支付宝扫一扫, 向我打赏

留下足迹