ArrayList详解

date
Jul 23, 2021
slug
ArrayList
status
Published
tags
Java
Collections
summary
ArrayList源码学习日志
type
Post
Language

特性

  • ArrayList利用泛型顺序存储类型西相同的元素,允许存放null元素
  • 底层由数组实现
  • 不是线程安全
  • 扩容机制,当前存储的个数不能大于容量
  • getset时间复杂度为O(1),addremove因为由数组移动操作复杂度平均为线性时间

get方法

public E get(int index) {
    rangeCheck(index); // 下标越界检查
    return (E) elementData[index]; //注意类型转换
}

set方法

public E set(int index, E element) {
    rangeCheck(index); //下标越界检查
    E oldValue = elementData(index);
    elementData[index] = element; //赋值到指定位置
    return oldValue;
}

add方法

public void add(int index, E element) {
        rangeCheckForAdd(index); //下标越界检查
        ensureCapacityInternal(size + 1);  // 扩容机制
        System.arraycopy(elementData, index, elementData, index + 1,size - index); 
				// 截取数组将index的部分移动到index + 1,给新元素留出空位
        elementData[index] = element;
        size++;
    }
System.arratcopyArrays.copyOf 的区别:前者位Java原生方法,后者实现也是调用的前者,会新建一个数组

remove方法

public E remove(int index) {
        rangeCheck(index); //下标越界检查

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index, numMoved);
				// 截取数组将index + 1的部分移动到index,让被删除的元素排列在数组尾部
        elementData[--size] = null; // 让CG可以回收

        return oldValue;
    }
 

© chobit blog 2025