ArrayList_JDK12.0_源码分析1
public static void main(String[] args) {
ArrayList list = new ArrayList();
//第一次调用添加方法时,完成Object类型的数组初始化为10
list.add("hello");
list.add("world");
list.add("hello");
list.add("world");
list.add("hello");
list.add("world");
list.add("hello");
list.add("world");
list.add("hello");
list.add("world");
list.add("11111");
Object [] obj = {
};
System.out.println(obj);
ArrayList list = new ArrayList(20);
}
(1)无参构造方法
this.elementData 是一个Object类型的数组
* DEFAULTCAPACITY_EMPTY_ELEMENTDATA;也是一个Object类型的数组
* DEFAULTCAPACITY_EMPTY_ELEMENTDATA;默认长度为0且在堆中开辟了空间
* public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
//相当于this.element = {};
}
(2)带参构造方法
* public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
//this.elementData = new Object[20];
}
}
(3)添加方法 add(Object obj);
public boolean add(E e) {
modCount++; //添加标志加一
add(e, elementData, size); //将e加入elementData数组,且原数大小为size
return true;
}
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length) //判断是否还有空间
elementData = grow(); //没有则添加
elementData[s] = e; //将元素e添加入elenmentData
size = s + 1;
}
*
(4)检测容量是否够用,扩容方法
if (s == elementData.length) //判断是否还有空间
elementData = grow(); //没有则添加
private Object[] grow() {
return grow(size + 1);
}
private Object[] grow(int minCapacity) {
//newCapacity 将新容量赋值给elementData
return elementData = Arrays.copyOf(elementData,newCapacity(minCapacity)); //数组拷贝 elementData 的长度为10
}
private static final int DEFAULT_CAPACITY = 10; //每次扩容加1
private int newCapacity(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length; //int oldCapacity = 0;
int newCapacity = oldCapacity + (oldCapacity >> 1); //int new Capacity = 0+0
if (newCapacity - minCapacity <= 0) {
//0-10<=0 true
//以下代码相当于elementData = {};
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
//计算 Math.max(10,1);
return Math.max(DEFAULT_CAPACITY, minCapacity);//返回结果为10
}
return (newCapacity - MAX_ARRAY_SIZE <= 0)
? newCapacity
: hugeCapacity(minCapacity);
}