ArrayList
1.Array List的特点:
1.实现了List接口,存储有序的,可以重复的数据。
2.底层使用Object[]数组存储。
3.线程不安全的。
2.ArrayList源码解析:
2.1jdk7版本:(以jdk1.7.0_07为例)
//如下代码的执行:底层会出初始化数组,数组的长度为10。Object[] elementsData = new Object[10];
ArratList list = new ArrayList<>();
list.add("AA"); //elementData[0] = "AA";
list.add("BB");//elementData[1] = "BB";
...
当要添加第11个元素的时候,底层的elementData数组已满,则需要扩容。默认扩容为原来长度的1.5倍。并将原有数组中的元素复制到新的数组中。
2.2 jdk8版本:(以jdk1.8.0_271为例)
//如下代码的执行:底层会出初始化数组,即Object[] elementsData = new Object[]{};//注:这里不会报错,相当于elementsData[0]=null;
ArratList list = new ArrayList<>();
源码里面:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//得到一个数组,而这个数组的初始化为下面这个
}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//默认只初始化一个数组,不申请长度为10的数组
list.add("AA"); //首次添加元素时,会初始化数组elementData = new Object[10]; elementData[0] = "AA";
list.add("BB");//elementData[1] = "BB";
...
//默认为长度为10的数组
当要添加第11个元素的时候,底层的elementData数组已满,则需要扩容。默认扩容为原来长度的1.5倍。并将原有数组中的元素复制到新的数组中。
扩容的代码如下:
扩容1.5倍
小结:
jdk1.7.0_07版本中:ArrayList类似于饿汉式
jdk1.8.0_271版本中:ArrayList类似于懒汉式