ArrayList的底层分析

先说结论,在证明:

1.ArrayList中维护了一个Object类型的数组elementData.(ArrayList中的储存数组)

2.当创建ArrayList对象时,如果使用的是无参构造器,则初始elementDate容量为0,第一次添加,则扩容elementData到10,如果在需要扩容,则扩容elementData为1.5倍。

3.如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。

java 复制代码
 ArrayList list=new ArrayList();创建一个对象,我们看看底层会发生啥

deBug的步入

java 复制代码
 public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
elementData是存储数组, DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空数组赋给elementData
java 复制代码
   private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

退出ArrayList创建对象。

java 复制代码
   for (int i=1;i<=10;i++){
            list.add(i);循环添加到ArrayList里面

看看add方法咋运行

java 复制代码
  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
先有一个自动装箱的过程,将数字转换成integer类型
java 复制代码
public boolean add(E e) {
        modCount++;
        add(e, elementData, size);
        return true;
    }
e是添加的元素,modCount是添加的次数,调用的ArrayList的其他add方法,传入了一个e,elementData空数组,size元素个数

步入另一个add方法

java 复制代码
 private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)
            elementData = grow();
        elementData[s] = e;
        size = s + 1;
第一个判断 元素数量是否等于空数组的length,如果等于要对数组扩容,没有等于则直接进行添加

步入grow方法

java 复制代码
private Object[] grow() {
        return grow(size + 1);
    }
继续步入里面的grow方法
java 复制代码
 private Object[] grow(int minCapacity) {
        int oldCapacity = elementData.length;
        if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            int newCapacity = ArraysSupport.newLength(oldCapacity,
                    minCapacity - oldCapacity, /* minimum growth */
                    oldCapacity >> 1           /* preferred growth */);
            return elementData = Arrays.copyOf(elementData, newCapacity);
        } else {
            return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
        }
    }
    将数组elementData长度赋给oldCapacity.
     oldCapacity进行判断扩容力度
        如果oldCapacity大于0或者elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA说明elementData不是首次扩容,然后进行1.5倍数进行扩容。
否则给elementData 返回DEFAULT_CAPACITY为10的数。
相关推荐
LXY_BUAA1 分钟前
《嵌入式操作系统》_framebuffer驱动_20261008
linux·运维·算法
泡海椒2 分钟前
JQuickExcel 大文件排障与调优:从实际路径定位 OOM、临时盘和慢任务
开发语言·数据库·缓存·oracle·excel
Logic1014 分钟前
C语言/数据结构字符串题解:统计“chhc“子串权值总和——一次遍历模式匹配
c语言·数据结构·算法·字符串·时间复杂度·空间复杂度·ascii
诺NA亚4 分钟前
ElasticSearch+RAG初使用
java
java_nnnn5 分钟前
LeetCode刷题滑动窗口(最大连续1的个数三+将x减到0的最小操作数)Java
算法·leetcode·职场和发展
SamDeepThinking7 分钟前
synchronized 和 lock 有什么区别?
java·后端·面试
m0_5873830013 分钟前
无人自助拼豆系统的全栈开发方案
java·后端·struts·小程序·架构
雪碧透心凉_18 分钟前
PythonWin32API窗口与鼠标操作
开发语言·python·计算机外设
临期冰淇淋26 分钟前
MTK平台 安卓16 GMS报错修改
android·java·前端
人道领域26 分钟前
【面试八股速通篇01】锁与并发工具
java·开发语言·面试·c#