ArrayList实现原理(JDK1,Java篇

对于传入容量的构造方法,当传入参数 > 0时,直接初始化对应容量的数组,参数类型为int,也即ArrayList的最大初始容量不能超过Integer.MAX_VALUE,事实上ArrayList的最大容量也只能是Integer.MAX_VALUE。而初始容量传入0,会赋值为空数组EMPTY_ELEMENTDATA。如果 < 0,这个显然的不允许了,直接IllegalArgumentExceptionpublic ArrayList(Collection<? extends E> c
摘要由CSDN通过智能技术生成

对于传入容量的构造方法,当传入参数 > 0时,直接初始化对应容量的数组,参数类型为int,也即ArrayList的最大初始容量不能超过Integer.MAX_VALUE,事实上ArrayList的最大容量也只能是Integer.MAX_VALUE。而初始容量传入0,会赋值为空数组EMPTY_ELEMENTDATA。如果 < 0,这个显然的不允许了,直接IllegalArgumentException

public ArrayList(Collection<? extends E> c) {

elementData = c.toArray();

if ((size = elementData.length) != 0) {

// c.toArray might (incorrectly) not return Object[] (see 6260652)

if (elementData.getClass() != Object[].class)

elementData = Arrays.copyOf(elementData, size, Object[].class);

} else {

// replace with empty array.

this.elementData = EMPTY_ELEMENTDATA;

}

}

集合构造时,没有进行null校验,也就是说如果传入null,直接就会NPE异常。集合构造的逻辑也很简单,当传入集合不为空时,调用Arrays.copyOf进行复制,并且容量 size为传入大小,而传入集合为空,则赋值为空数组EMPTY_ELEMENTDATA。

3.添加元素

ArrayList在添加元素时,都会进行容量确认,可能会涉及到扩容,数组复制,所以效率相对较低。同时在添加元素时,ArrayList并未对元素本身进行校验,所以是允许集合中存在null的情况。

3.1.尾部添加元素

public boolean add(E e) {

// 确定容量

ensureCapacityInternal(size 1); // Increments modCount!!

// 设值

elementData[size ] = e;

return true;

}

在add()方法中,最主要的是确定容量ensureCapacityInternal(int minCapacity)方法。

private void ensureCapacityInternal(int minCapacity) {

ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));

}

首先会调用calculateCapacity(Object[] elementData, int minCapacity) 计算容量然后再ensureExplicitCapacity(int minCapacity)

private static int calculateCapacity(Object[] elementData, int minCapacity) {

if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {

return Math.max(DEFAULT_CAPACITY, minCapacity);

}

return minCapacity;

}

这里仅仅判断了是否是空数组DEFAULTCAPACITY_EMPTY_ELEMENTDATA(== 地址比较),如果前面还有印象的话,这个只会在无参构造时,才会初始化为DEFAULTCAPACITY_EMPTY_ELEMENTDATA,这时候会取DEFAULT_CAPACITY(10)与传入minCapacity的较大值,常说的默认容量大小10也就是在这里诞生的。

而其他的情况,都直接但会minCapacity,也即 size 1,如果首次添加,那就是1。

private void ensureExplicitCapacity(int minCapacity) {

modCount ;

// overflow-conscious code

if (minCapacity - elementData.length

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值