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的数。
相关推荐
kaico2018几秒前
远程调用组件openfeign
java·spring cloud
SunnyDays1011几秒前
如何使用 JAVA 将 PDF 转换为 PPT:完整指南
java·开发语言·pdf转ppt
qq_12498707531 分钟前
基于springboot归家租房小程序的设计与实现(源码+论文+部署+安装)
java·大数据·spring boot·后端·小程序·毕业设计·计算机毕业设计
csbysj20202 分钟前
Python Math: 深入探索Python中的数学模块
开发语言
Bigbig.3 分钟前
驱动工程师面试题 - 操作系统1
linux·开发语言·面试·硬件架构
是一个Bug3 分钟前
Java后端开发面试题清单(50道)
java·开发语言·jvm
GIS 数据栈5 分钟前
【Seggis遥感系统升级】用C++高性能服务Drogon重构软件服务架构|QPS提升300%,性能再升级!
java·开发语言·c++·重构·架构
moxiaoran57536 分钟前
Go语言的接口
开发语言·后端·golang
一条大祥脚7 分钟前
26.1.3 快速幂+容斥 树上dp+快速幂 带前缀和的快速幂 正序转倒序 子序列自动机 线段树维护滑窗
数据结构·算法
2301_780669869 分钟前
List(特有方法、遍历方式、ArrayList底层原理、LinkedList底层原理,二者区别)
java·数据结构·后端·list