浅谈ArrayList(二)------源码探索

浅谈ArrayList(一)中简单介绍了ArrayList的一些使用方法,首先看一段代码

ArrayList arrayList=new ArrayList(10);
		for(int i=0;i<20;i++)
		{
			arrayList.add(i);
		}

在此处new了一个ArrayList,容量为10,但是添加了20个数据,依然可以存入其中,这时我们就得查看一下add方法

主要关注的源码如下

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

这个add方法的是将指定的元素追加的列表的末尾,方法内代码简单,就三句,第一句的意思稍微思考一下就知道就是对容量的处理,如果没有数据,size则为0,当add时,加1进行容量扩展。第二句便是正常的将参数追加到列表末尾去,然后返回true。

        查看ensureCapacityInternal源码:

private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }

       其中elementData是元素实际存储数组,DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个默认的空数组,传入的参数minCapacity是指所需的最小容量,add方法中传入的是一个size+1的参数,一开始则传入1,之后依次增加;if语句对空进行判断,为空则使用Math.max方法进行扩容,主要关注代码为最后一句,查看ensureExplicitCapacity方法源码:

 private void ensureExplicitCapacity(int minCapacity) {
        modCount++;//来自抽象类,不能持久化
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)//如果传入的容量大于实际数据存储长度,则调用grow方法
            grow(minCapacity);
    }
/**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);//新容量加一半(如oldCapacity为10,newCapacity则为15)
        if (newCapacity - minCapacity < 0)//比较
            newCapacity = minCapacity;//新创建容量大则使用最小容量,即传入的容量值minCapacity
        if (newCapacity - MAX_ARRAY_SIZE > 0)//超出最大长度处理,估计是难以超出,感兴趣自己去看源码
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);//复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度
    }
此时便实现了add添加,这只是实现向列表末尾添加数据,还有指定位置插入数据。以后再慢慢道来!



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盒曰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值