初学ArrayList类add方法

ArrayList类的add方法

当前版本为jdk1.8.0_102

一、使用时共有三种情况:

	1、 0<=size<length	即正常添加数据
				将元素放置到elementData[size]
	2、 size == 0		即第一次添加数据
				第一次添加数据时利用初始长度右移仍未0这一特点,将数组扩容到10。		
	3、 length<size		即当元素个数超出数组范围时添加
				对当前元素个数进行判断,如果其大于数组长度则扩容,反之不扩容。
				扩容使用Arrays.copyOf()方法将原数组进行复制,此方法底层实现速度为o(n)。
			   															(时间复杂度速度百度的来,未验证) 

二、相关程序:

//静态常量
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
private static final int DEFAULT_CAPACITY = 10;
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//数组变量
private int size; //数组元素个数
transient Object[] elementData;//数组引用

public boolean add(E e) {
	//传递当前元素个数
    ensureCapacityInternal(size + 1); 
    //数组赋值
	elementData[size++] = e;
    return true;
}

private void ensureCapacityInternal(int minCapacity) {
    //处理数组为空的情况,
    //如果为空则将minCapacity置为10,此时minCapacity大于0超出元素个数
	if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }
	
    ensureExplicitCapacity(minCapacity);
}

private void ensureExplicitCapacity(int minCapacity) {
    //集合修改次数
	modCount++;
    //判断元素是否超过数组长度,超过则扩容
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

private void grow(int minCapacity) {
	//获取当前数组的长度
    int oldCapacity = elementData.length;
    //计算新数组的长度,其值为原数组的1.5倍。
	int newCapacity = oldCapacity + (oldCapacity >> 1);
	
    //数组为空时,将数组扩容到10。
	if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    //检查数组长度是否达到最大值
	if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
	
	//复制原数组至新数组
    elementData = Arrays.copyOf(elementData, newCapacity);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值