手记

对ArrayList源码的重新阅读,以及问题得发现

今天重新阅读了ArrayList的源码,发现了一个问题。当你百度ArrayList的初始默认容量的时候,几乎所有的答案都是10,但是我在阅读源码的时候却发现不是这样的。

image.png

首先看他的成员变量:
private static final int DEFAULT_CAPACITY = 10;默认容量是10;
private static final Object[] EMPTY_ELEMENTDATA = {};一个空的object数组
private transient Object[] elementData; 声明一个object数组用于存放数据;
private int size;   数组元素的个数;
在这里可以看到一个默认的容量是10;那么是不是就说明当我们使用无参构造创建一个ArrayList集合时他的默认容量就是10呢;
接下来继续看:
两个主要构造

image.png


可以看到在无参构造中this.elementData = EMPTY_ELEMENTDATA;
只是将一个空的object数组赋值给了elementData;并不是创建了一个长度为10 的数组;
继续看add方法:

image.png


add方法调用了ensureCapacityInternal(size + 1);这个方法;

image.png


这个图可以清晰的看出ArrayList在第一次调用add方法时才扩容到10,那么他的初始默认容量为0;
下面我们debug下看一看:

image.png


进入add方法

image.png


这时我们看下elementData的length是多少;

image.png


是0;
继续向下执行

image.png


此时的minCapacity为1;
执行if语句

image.png


minCapacity已经变为DEFAULT_CAPACITY的10;
继续执行
执行grow方法

image.png


扩容结束,我们在看看elementData的length是多少;

image.png


已经变为10;

此时已经确认了ArrayList的初始容量为0;第一次调用add方法时将容量扩容到10;那么百度上那么多大神为什么都说初始容量为10呢;
经过我一番查看发现1.6jdk和1.7jdk下的ArrayList构造不太一样
1.6的
public ArrayList() {
this(10);
}
这里可以看到在调用无参构造时会调用带参数的构造函数,初始化了一个长度为初始容量的数组;
1.6的ArrayList初始容量为10;
在看网上别人的1.7ArrayList源码解析的时候发现他们的1.7构造和1.6的是一样的;链接http://blog.csdn.net/liuzongxi/article/details/44756687
难道是我的1.7和别人的1.7有不同么

image.png


这是我的jdk;不知道你们的是什么样的;
如有错误请指正!!!



作者:慢跑的鱼
链接:https://www.jianshu.com/p/e8a2f7295766


0人推荐
随时随地看视频
慕课网APP