ArrayList构造方法详解-使用无参构造方法创建对象

使用无参构造方法创建对象

package com.jettyw.arraylist;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author jettyw
 * 2017-05-25
 * 使用无参构造方法创建ArrayList对象
 */
public class ArrayListConstructorTest {
	public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
	}
}

从上一节我们知道使用无参构造时this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;数组初始化为一个长度为0的空数组。那么在我们第一次添加元素的时候,elementData的长度是如何实现扩展的。

我们调用ArrayList的添加元素的方法add(E e)

public boolean add(E e) {
        //先确保数组的长度够用,否则进行扩展
        //size=0
        ensureCapacityInternal(size + 1); 
        //添加元素,将元素添加到数组中
        elementData[size++] = e;
        return true;
    }

此时的size为0,调用ensureCapacityInternal(int minCapacity)方法这是一个私有方法。

private void ensureCapacityInternal(int minCapacity) {
          //如果使用无参构造方法创建对象,第一次添加元素,数组最小的长度为默认长度10
          //DEFAULT_CAPACITY为ArrayList声明的常量为10
         if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            //使用无参构造方法minCapacity=10
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
       //如果不是第一次添加元素,不使用无参构造方法创建对象,走下一步确定一下是否要扩展数组
        ensureExplicitCapacity(minCapacity);
    }

调用ensureExplicitCapacity(minCapacity)方法进行最终的确认是否要扩展数组长度。

private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

       //如果最小长度比数组的长度大,则扩展数组长度,否则不扩展,直接添加元素
       //使用无参构造方法第一次minCapacity=10 数组长度为0,需要扩展调用grow()
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

接着调用grow(minCapacity)进行元素的扩展。

private void grow(int minCapacity) {
        //当前数组的长度
        //使用无参构造方法第一次添加元素oldCapacity=0
        int oldCapacity = elementData.length;
        //将要将数组扩展到的长度,如果要扩展,数组的新长度总是原来长度的1.5倍
        //使用无参构造方法第一次添加元素 newCapacity=0
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //如果新长度小于最小长度,说明目前数组的长度够用,不需要扩展
        //使用无参构造方法newCapacity=10
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        //如果要扩展的长度比默认最大长度要打,则使用调用hugeCapacity()方法获取长度
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        //扩展数组之后进行数组的复制,将原来数组复制到扩展后的数组里面
        //使用无参构造方法第一次添加元素扩展之后的数组长度为10
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

不需要扩展的直接走elementData[size++] = e;否则扩展数组之后才走elementData[size++] = e;添加元素。在分析完源码之后我们可以得出结论,使用无参构造方法第一次添加元素产生一个长度为10的数组,在后续的添加过程中依然按照这个流程进行确定是否进行扩展数组长度。并且在扩展数组长度的时候再一次使用了Arrays.copyOf(elementData, newCapacity)方法进行数组的复制

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值