亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

對ArrayList源碼的重新閱讀,以及問題得發現

標簽:
Java

今天重新阅读了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


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消