今天重新阅读了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
共同学习,写下你的评论
评论加载中...
作者其他优质文章