通过反射对ArrayList的初始容量浅析


      今天在看ArrayList的源码时发现,ArrayList的空参构造方法中默认初始容量是0,有一点感到不解,上课老师有提到过ArrayList的初始容量是10。找来旧版查看JDK源码后发现,JDK1.6、1.7、1.8在ArrayList的空参构造方法上有略微区别。
    看JDK1.8的源码:


     private static final int DEFAULT_CAPACITY = 10;
     private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
      /**
     * Shared empty array instance used for empty instances.
     */
     private static final Object[] EMPTY_ELEMENTDATA = {};
   /**
     * Constructs an empty list with an initial capacity of ten.
   */
     public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

 JDK1.7的源码

public ArrayList() {
        super();
        this.elementData = EMPTY_ELEMENTDATA;
    }

JDK1.6的源码

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
   public ArrayList() {
   this(10);
   }

   可以看出1.6的源码直接在构造方法中默认初始容量为10.而1.7、1.8在构造方法中默认初始容量为空,

1.8源码涉及到扩容的代码

/**
     * Increases the capacity of this <tt>ArrayList</tt> instance, if
     * necessary, to ensure that it can hold at least the number of elements
     * specified by the minimum capacity argument.
     *
     * @param   minCapacity   the desired minimum capacity
     */
    public void ensureCapacity(int minCapacity) {
        int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            // any size if not default element table
            ? 0
            // larger than default for default empty table. It's already
            // supposed to be at default size.
            : DEFAULT_CAPACITY;

        if (minCapacity > minExpand) {
            ensureExplicitCapacity(minCapacity);
        }
    }

 

 从这一段代码我们已经可以看出,ArrayList的底层实现是数组,原来第一次在ArrayList集合中添加元素时,会把数组初始化为10。这一点我们可以利用反射原理来验证,通过暴力反射强行获取elementData数组的长度,也就是ArrayList的容量Capacity

public class Demo1 {
	public static void main(String[] args) throws Exception {
		ArrayList list=new ArrayList();
		Class clazz=Class.forName("java.util.ArrayList");
		Field elementData=clazz.getDeclaredField("elementData");
		elementData.setAccessible(true);
		Object[] arr=(Object[]) elementData.get(list);
		System.out.println(arr.length);
	}
}

运行结果为:

 

可以看出ArrayList的初始容量确实为0。

在往集合中添加两个元素后会发现

public class Demo1 {
	public static void main(String[] args) throws Exception {
		ArrayList list=new ArrayList();
		list.add("a"); 
		list.add(1);
		Class clazz=Class.forName("java.util.ArrayList");
		Field elementData=clazz.getDeclaredField("elementData");
		elementData.setAccessible(true);
		Object[] arr=(Object[]) elementData.get(list);
		System.out.println(arr.length);
	}
}

 运行结果:

此时集合中容量已经为10。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值