ArrayList源码解析

本文主要探讨ArrayList在Java中的创建方式,包括无参构造和指定容量构造,并详细解析了add()方法,涉及ensureCapacityInternal()和calculateCapacity()的逻辑,揭示ArrayList如何动态调整内部数组的大小。
摘要由CSDN通过智能技术生成

学习和工作中经常会使用List来存储数据,那么今天就来解析List的一个基于实现ArrayList类源码,不再废话,开始学习:

源码解析:

ArrayList创建的几种方式:

new ArrayList<>();// 无参方式

DEFAULTCAPACITY_EMPTY_ELEMENTDATA: 用于默认大小的空实例的共享空数组实例。

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

elementData: ArrayList的内部用来存储数据的数组。

new ArrayList<>(5);// 指定参数方式

构造一个具有 指定初始容量的 内部数据数组
3个分支:
分支一: initialCapacity > 0:
             如果指定的初始容量>0 创建一个指定长度的数组;
分支二: initialCapacity == 0:
             如果初始容量==0 创建一个空实例 EMPTY_ELEMENTDATA={};
             
分支三: iinitialCapacity < 0:
             throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
             如果指定的初始容量为负数,抛出一个IllegalArgumentException(非法参数异常);

ArrayList中的方法解析:

add(): 添加元素

add: 将指定的元素(E e)追加到列表(内部数组)的末尾。

ensureCapacityInternal( size + 1 ) : 是否增加数组长度

calculateCapacity( elementData,  minCapacity): 返回要增加的数组长度

elementData: 内部数组对象,minCapacity:指定的数组长度。

2个分支:

分支一: elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA

                     如果内部数组对象 == {} 空对象 进行一个Math.max比较大小赋值,                                                 Math.max(DEFAULT_CAPACITY, minCapacity)                                                                                 minCapacity初始值为1,DEFAULT_CAPACITY默认值为10

                     

                     所以该方法第一次会默认返回10个大小;

分支一: 

             如果elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA

             只有第一次add的时候elementData才是{} 空对象,第二次之后数组就有了长度

             所以从第二次add开始 再进入calculateCapacity方法只会进入分支二运行

             

             从第二次add开始之后再进入calculateCapacity方法会返回指定的数组长度minCapacity

待续~

 

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值