关于ArrayList源码跟踪

ArrayList内部实现

ArrayList定义

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
}

//AbstractList内部定义
protected transient int modCount = 0;

ArrayList内部是通过数组实现的

//ArrayList内部定义一下变量

//定义一个Object类型的数组
transient Object[] elementData;

//定义一个空的Object类型的数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

//定义一个int类型的size变量
private int size;

//定义数据默认扩容大小为10
private static final int DEFAULT_CAPACITY = 10;

//定义一个int类型的最大值
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

无参构造函数

ArrayList arrayList = new ArrayList();

//无参构造函数内部初始化了elementData数组
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//将Object空数组赋值给elementData
}

通过add添加元素

arrayList.add("a");

public boolean add(E e) {
    //确保内部容量大小
    ensureCapacityInternal(size + 1);  // Increments modCount!!    size默认是0
    elementData[size++] = e;
    return true;
}

private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

private static int calculateCapacity(Object[] elementData, int minCapacity) {
    //如果为true则代表是第一次
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        //取DEFAULT_CAPACITY和minCapacity,其中较大的值,DEFAULT_CAPACITY为10.所以这就是为啥ArrayList默认初始大小为10
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;//记录调整次数
    
    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

//数组真正扩容方法
private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;//数组原来长度
    int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容后的长度 =原来长度+原来长度/2
    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);//数组的扩容
}

 private static int hugeCapacity(int minCapacity) {
     if (minCapacity < 0) // overflow
         throw new OutOfMemoryError();
     //三元运算符  返回两个值中较小的一个
     return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE :  MAX_ARRAY_SIZE;
 }

代码debug







扩展

transient 是Java语言的关键字,用来表示一个成员变量不是该对象序列化的一部分。当一个对象被序列化的时候,transient型变量的值不包括在序列化的结果中。

数组扩容长度

//声明int类型数据,并初始化三个元素
int[] arr = {1, 2, 3};
//通过Arrays.copyOf方法将arr数据长度扩容到10个元素
arr = Arrays.copyOf(arr, 10);

Idea配置设置

debug可以查询所有的信息

posted on 2022-09-01 14:56  南晓东  阅读(18)  评论(0编辑  收藏  举报