java开发进阶程序员Java 杂谈

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

2017-10-14  本文已影响99人  慢跑的鱼

今天重新阅读了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;不知道你们的是什么样的;
如有错误请指正!!!

上一篇下一篇

猜你喜欢

热点阅读