ArrayList特点:
- ArrayList底层维护的是一个数组。
- ArrayList允许一个或多个元素为null。
- ArrayList基本等同于Vector,但ArrayList是线程不安全的(执行效率高),所有在多线程的情况下,不建议使用ArrayList。
ArrayList底层:
1.使用无参构造ArrayList对象.
1.初始化对象
//使用无参构造器创建 ArrayList 对象
ArrayList list = new ArrayList(); //dubug进入
其中elementData就是实质上存放数据的地方,是一个Object数组,也就应证了ArrayList底层维护的是一个数组这个说法。
经过dubug,new ArrayList()这一步只是给elementData赋值了一个空数组,没有做任何的其他操作。
2.第一次添加数据
首先进行的是一个数据的装箱操作。
随后执行add()方法。
可以看到,在add方法的第一行,有一个ensureCapacityInternal()的方法,每次执行add()方法总是会执行 ensureCapacityInternal()方法,其含义是是否执行扩容。
该方法确定minCapacity,第一次扩容为10。专门处理第一次添加元素。
ensureExplictitCapacity()方法为确定要扩容的方法,modCount是记录集合被修改的次数。if语句的含义是如果数组长度不够最小需要的长度,就执行扩容。grow为真正扩容的方法。
可以看到,第一次扩容为10,之后为长度的1.5倍(oldCapacity >> 1),扩容的机制是数组拷贝(Arrays.copyOf())。
2.使用有参构造ArrayList对象。
直接初始化elementData为指定大小的数组。
其他操作和无参构造一样。
Vector
他是线程安全的,但是执行效率不如ArrayList。Vector的底层与ArrayList大同小异,首先,它们默认初始化长度都为10,但是Vector的扩容是以两倍来扩容,ArrayList是1.5倍。底层的实现机制相似。