ArrayList详解

[toc]

ArrayList具有以下特点:

  • 底层:动态数组,初始容量为0,第一次添加元素时才会初始化为10
  • 时间复杂度:下标查询O(1),随机插入或删除:O(n),末尾插入O(1)
  • 线程安全性:不安全,如何保证安全?
    • 在方法内使用:局部变量 -> 不存在线程安全问题
    • synchroniozedList();
  • 构造方法
    • 无参:创建默认大小为10的空数组
    • 初始化容量:返回一个给定容量大小的数组
    • 参数是Collection对象:如果是ArrayList直接赋值,否则用copyOf复制
  • 扩容机制:初始容量为10,每次扩容到之前的1.5倍,开辟新空间,并用copyOf将元素从旧数组复制到新数组
源码分析
1
private static final int DEFAULT_CAPACITY = 10;		// 初始容量为10

三种构造函数:

  • 无参

    1
    2
    public ArrayList() {        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;    }
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  • 给定初始容量:返回一个该容量大小的Object[]数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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);
    }
    }
  • 参数为Collection对象:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public ArrayList(Collection<? extends E> c) {
    Object[] a = c.toArray();
    if ((size = a.length) != 0) {
    if (c.getClass() == ArrayList.class) { // 如果参数是ArrayList,直接赋值
    elementData = a;
    } else { // 不是ArrayList,使用copyOf进行复制
    elementData = Arrays.copyOf(a, size, Object[].class);
    }
    } else { // 为空直接返回EMPTY_ELEMENTDATA
    elementData = EMPTY_ELEMENTDATA;
    }
    }