首页 > 编程语言 >java List 源码

java List 源码

时间:2023-03-01 17:22:32浏览次数:41  
标签:扩容 java elementData List minCapacity 数组 长度 源码 size

概述

底层通过数组实现,所以 查询/更新效率很高,删除/增加跟位置相关,除未实现同步外和 Vector 大致相同

扩容

public boolean add(E e) {
    // 数组扩容,不是一定要扩容,需要扩容才扩容
    // 初始化 ArrayList 时如果不指定长度或者指定长度为0,size 就是 0(属性 size 是 int,默认值是0)
    ensureCapacityInternal(size + 1); 
    // 数组最后一个位置存放新增的元素(elementData是底层存放数据的数组)
    elementData[size++] = e;
    return true;
}

// 扩容方法具体逻辑(minCapacity 是 size+1)
private void ensureCapacityInternal(int minCapacity) {
    // calculateCapacity(elementData, minCapacity):确定数组添加元素后的真实长度
    // ensureExplicitCapacity():1,记录 list 修改次数;2,添加元素后是否扩容
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

// 确定数组添加元素后真实长度逻辑
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    // 初始化 ArrayList 没有指定长度或指定长度是0时 elementData 就等于 DEFAULTCAPACITY_EMPTY_ELEMENTDATA(构造方法)
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        // 如果初始化时没有指定长度或长度是0时,size 是 0,minCapacity = size+1,所以 minCapacity 就是1
        // DEFAULT_CAPACITY 是 10,两者取其大作为 数组长度
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    // 如果初始化时指定了长度,那么就是 size+1 为数组长度
    return minCapacity;
}

// 真正的扩容处理
private void ensureExplicitCapacity(int minCapacity) {
    modCount++; // 记录修改次数
    // 如果新的长度大于原来的长度就扩容
    if (minCapacity - elementData.length > 0)
        // 进入这里就表明需要扩容了(大约原来的长度1.5倍):1,复制一个新的数组;2,更新 size(然后回到 add() 方法中把元素放在数组末尾)
        grow(minCapacity); 
}

标签:扩容,java,elementData,List,minCapacity,数组,长度,源码,size
From: https://www.cnblogs.com/hangychn/p/17168994.html

相关文章