美文网首页Java集合类源码探究
【java容器的刻意练习】【二】ArrayList底层数据结构

【java容器的刻意练习】【二】ArrayList底层数据结构

作者: 程序猿修仙传 | 来源:发表于2020-01-30 22:48 被阅读0次

    今天开始学习ArrayList源码(以后所有源码都在jdk1.13上分析)。学习源码肯定要带着问题来学的,要不漫无目的就不是学习,是浪费时间。

    一般我们都有以下几个问题:

    • ArrayList底层是什么数据结构?
    • ArrayList如何实现自动扩容?
    • ArrayList优缺点是什么?
    • ArrayList面试中有哪些考点?
    • ArrayList工作中用在什么场景?

    今天我们先解决第一个问题:ArrayList底层是什么数据结构?

    先创建一个ArrayList。

    ArrayList arrayList = new ArrayList();
    

    进去看ArrayList()这个构造函数,如下:

        public ArrayList() {
            this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
        }
    

    这时候我们应该想到2个问题:

    • elementData 是啥?
    • DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是啥?

    继续看

        private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = new Object[0];
        transient Object[] elementData;
    

    原来 elementData 是个数组对象!(用transient关键字标记的成员变量不参与序列化过程)
    而 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 就是创建一个空洞数组!

    那么,我们知道了,这个ArrayList构造函数只是创建一个空数组!

    再看看另外的构造函数,只是创建传进来大小的数组,或者复制传进来的集合,就这么简单。

    ArrayList传长度参数的构造函数 ArrayList传集合参数的构造函数

    所以,到现在我们知道了,ArrayList底层数据结构实际就是一个数组!

    相关文章

      网友评论

        本文标题:【java容器的刻意练习】【二】ArrayList底层数据结构

        本文链接:https://www.haomeiwen.com/subject/mulithtx.html