ArrayList源码

//属性
//默认初始大小
private static final int DEFAULT_CAPACITY = 10;
//空数组用这个
private static final Object[] EMPTY_ELEMENTDATA = {};
//扩展数组时用来和EMPTY_ELEMETDAT
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//添加第一个元素时将会扩大多DEFAULT_CAPACITY
transient Object[] elementData;
//数组大小
private int size;

构造函数:

public ArrayList(int initialCapacity) {
// 初始容量大于0,数组大小就是这么多
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
// 如果为0,为已经设置的EMPTY_ELEMENTDATA
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
// 与EMPTY_ELEMENTDATA区分开
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

扩容机制:

// 确保容量足够
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
// any size if not default element table
? 0
// larger than default for default empty table. It's already
// supposed to be at default size.
: DEFAULT_CAPACITY;
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}

如果elementData不是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,就给minExpand赋值0,否则就是10;如果minCapacity > minExpand,进行精确确保容量

private void ensureExplicitCapacity(int minCapacity) {
//修改次数
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}

如果最小容量比数组长度大就扩容

// 尝试分配最大的数组大小,防止OutOfMemoryError
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}

可以看到newCapacity的大小是oldCapacity的1.5倍,如果newCapacity还是小于minCapacity,newCapacity = minCapacity;如果newCapacity已经比最大容量大了,就调用hugeCapacity方法,就直接把整数最大值赋给newCapacity;最后一步调用copyOf复制新数组

本文作者:xiaoovo

本文链接:https://www.cnblogs.com/xiaoovo/p/16937180.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   xiaoovo  阅读(15)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑