ArrayList详解
date
Jul 23, 2021
slug
ArrayList
status
Published
tags
Java
Collections
summary
ArrayList源码学习日志
type
Post
Language
特性
- ArrayList利用泛型顺序存储类型西相同的元素,允许存放
null元素
- 底层由数组实现
- 不是线程安全
- 扩容机制,当前存储的个数不能大于容量
get、set时间复杂度为O(1),add、remove因为由数组移动操作复杂度平均为线性时间
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.arratcopy 与 Arrays.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;
}