ArrayList源码理解

一、关于构造函数

1.无参构造,会直接给你一个空的名为 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的数组(在JDK6中是直接返回长度为10的数组)
在这里插入图片描述
根据此名字,在第一次添加元素时会将容量(capacity)增长至10。

2.有参构造,根据你传进去的 initialCapaticy(最初容量)决定,大于零返回此长度的数组,等于零返回 EMPTY_ELEMENTDATA(区别于DEFAULTCAPACITY_EMPTY_ELEMENTDATA)。
在这里插入图片描述
二、关于扩容机制
以使用无参构造器创建的数组为例,第一次添加元素时,size为0,minCapacity作为参数传进去的是1,在ensureCapacityInternal(确保容量内部)方法中调用了calculateCapacity,在其中会判断数组是否为最初的DEFAULTCAPACITY_EMPTY_ELEMENTDATA,是则将DEFULT_CAPACITY返回。
在第二次加入元素时,传入的minCapacity则为2(size是指元素的个数),所以,在calculateCapacity的判断不会通过。
而在ensureExplicitCapacity中 minCapacity在增加到11之前都不会触发grow函数。(minCapacity为所需最小容量也就是现拥有元素个数加一,elementData.length为容器大小。)
在这里插入图片描述
在这里插入图片描述
在添加第11个元素时,判断成立,调用grow函数。grow函数中非常简洁明了,直接将现容器大小赋值给oldCapacity,将容器增加至原来的1.5倍,此处用了右移一位(也就是除以2,但是效率比除法高,会取整,15>>1 = 7)。
在增加至1.5倍之后,会出现两种可能性:
1.还太小,则直接用最小满足容量minCapacity
2.大了(指比MAX_VALUE(MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8)大),则使用hugeCapacity让minCapacity与MAX_ARRAY_SIZE进行比较,大则返回Integer.MAX_VALUE,小则返回MAX_ARRAY_SIZE,前面的判断是看看minCapacity有没有超出int的范围(超出则会返回- 2 ^31)。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值