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的数。
相关推荐
starzy19902 小时前
Flink基础之Per-Job-Cluster原理详解:被 Application 取代的模式
java·大数据·flink
z落落3 小时前
C# WinForm Socket 转串口设备服务器+Modbus CRC16校验+Socket 客户端
服务器·开发语言·c#
小灰灰搞电子8 小时前
Rust+Slint 实现动态消息提示框源码分享
开发语言·后端·rust
魏 无羡9 小时前
webclient
java·webclient
神仙别闹9 小时前
基于 C++ 实现两个有序链表序列的交集
java·c++·链表
传奇开心果编程10 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
新时代牛马10 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python
swordbob10 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言
政企项目老覃11 小时前
大模型幻觉治理与自动评测:金融风控场景的落地实践
人工智能·算法·机器学习