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的数。
相关推荐
计算机学姐15 分钟前
基于SpringBoot的咖啡店管理系统【个性化推荐+数据可视化统计+配送信息】
java·vue.js·spring boot·后端·mysql·信息可视化·tomcat
前端小咸鱼一条23 分钟前
16.迭代器 和 生成器
开发语言·前端·javascript
My的梦想已实现25 分钟前
关于JAVA Springboot集成支付后打包JAR之后报安全错误的处理
java·spring boot·jar
小陈工31 分钟前
2026年3月31日技术资讯洞察:AI智能体安全、异步编程突破与Python运行时演进
开发语言·jvm·数据库·人工智能·python·安全·oracle
ooseabiscuit41 分钟前
SpringBoot3整合FastJSON2如何配置configureMessageConverters
java
ok_hahaha1 小时前
java从头开始-黑马点评-Redission
java·开发语言
无巧不成书02181 小时前
Java面向对象零基础实战:从Employee类吃透自定义类核心,掌握封装精髓
java·开发语言·java入门·面向对象·自定义类·employee类·java核心技术
小江的记录本1 小时前
【注解】常见 Java 注解系统性知识体系总结(附《全方位对比表》+ 思维导图)
java·前端·spring boot·后端·spring·mybatis·web
跃上青空1 小时前
Java如何优雅的使用fastjson2进行枚举序列化/反序列化,欢迎探讨
java·开发语言
Mr.45671 小时前
Spring Boot 集成 PostgreSQL 表级备份与恢复实战
java·spring boot·后端·postgresql