学习所得来源于b站韩顺平java精讲系列
ArrayList的注意事项
- permits all elements, including null ,
ArrayList
可以加入null
,并且多个 ArrayList
是由数组
来实现数据存储的ArrayList
基本等同于Vector
,除了 ArrayList是线程不安全(执行效率高),在多线程情况下,不建议使用ArrayList
底层操作机制源码分析
ArrayList中维护了一个Object类型的属组
elementData
transient Object[] elementData;
transient
表示瞬间,短暂的,表示该属性不会被序列化
- 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则扩容elementData为10,如果需要再次扩容,则扩容elementData为1.5倍
- 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍
1.分析使用无参构造器,创建和使用ArrayList的源码
代码演示
public class ArrayListSource {
public static void main(String[] args) {
ArrayList list = new ArrayList();
for (int i = 1; i <= 10 ; i++) {
list.add(i);
}
for (int i = 11; i <= 15 ; i++) {
list.add(i);
}
list.add(100);
list.add(200);
list.add(300);
}
}
2.分析使用有参构造器,创建和使用ArrayList的源码
1.创建指定大小的elementData
数组: this.elementData = new Object[指定的大小];
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
2.添加元素的操作与无参构造相同(同上)
3.只是在扩容的时候,会直接扩容为定义数组大小的1.5倍
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);
}