1.类图(JDK11 从idea中得到)
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final long serialVersionUID = 8683452581122892189L;
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
从这个类图中,结合代码,我们可以得出结论
此类继承AbstractList,实现了4个接口
默认初始容量是,但是如果你new一个不传参数的ArrayList,size开始是0,但是他会创建一个Object 为10的数组
idea查看方法:(如果idea看不到,请参考:
https://blog.csdn.net/qq_45929019/article/details/128768850
)
import java.util.ArrayList;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
List al=new ArrayList();
al.add(1);//自动装箱
System.out.println(al.size());
}
}
2.ArrayList底层
看下ArrayList代码,我们可以看到底层是起码为 elemetDate的Object数组,没有指定数组大小
初始化方法:
执行的源代码是:
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
总论:空数组赋值给elementData
3.Add方法
执行add 方法:
第一步代码:
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}
第二步代码:(中间代码省略直接到关键代码)
private int newCapacity(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity <= 0) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
return Math.max(DEFAULT_CAPACITY, minCapacity);
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return minCapacity;
}
return (newCapacity - MAX_ARRAY_SIZE <= 0)
? newCapacity
: hugeCapacity(minCapacity);
}
所以往ArrayList插入一个元素,elementData数组由0扩容到10,size还是### 4.扩容
import java.util.ArrayList;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
List al= new ArrayList();
for(int i=1;i<=10;i++) {
al.add(i);//自动装箱
}
al.add(11);
System.out.println(al.size());
}
}
当执行到超过10个元素的时候,数组扩容到15.
分析源码:
int newCapacity = oldCapacity + (oldCapacity >> 1)
就是新的数组大小=原来的大小+原来的大小右移1位(java中无符号右移一位,类似于除法除2运算)
等同于新的数组大小=原来的大小+原来的大小/2
15=10+10/2
所以ArrayList扩容是1.5倍,没有扩容因子,当数组容量超过最大值时扩容
其他API
ArrayList(int initialCapacity)
构造具有指定初始容量的空列表。