点击蓝色“程序员的时光 ”关注我 ,标注“星标”,及时阅读最新技术文章
写在前面:
小伙伴儿们,大家好!上一篇我们介绍了HashMap相关知识点——了解HashMap数据结构,超详细!
今天来学习ArrayList相关内容,作为面试必问的知识点,来深入了解一波!
思维导图:
1,ArrayList底层数据结构
ArrayList
就是动态数组,是List
接口的可调整大小的数组实现;除了实现List
接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组大小。它的主要底层实现是数组Object[] elementData
。
数组的特点大家都知道,遍历查询速度快——数组在内存是连续空间,可以根据地址+索引的方式快速获取对应位置上的元素。但是它的增删速度慢——每次删除元素,都需要更改数组长度、拷贝以及移动元素位置。
ArrayList
是 java 集合框架中比较常用的数据结构了。继承自 AbstractList
,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccess
、Cloneable
、Serializable
接口,所以ArrayList
是支持快速访问、复制、序列化的。
与ArrayList
类似的是LinkedList
,但是LinkedList
底层是链表,它的数组遍历速度慢,但增删速度很快。
小结:
ArrayList
底层是数组实现的存储,查询效率高,增删效率低。
2,ArrayList构造方法
下面是查看API中构造方法
2.1,无参构造方法
我们看源码中的无参构造方法:
无参构造,使用默认的size为10的空数组,在构造方法中没有对数组长度进行设置,会在后续调用add方法的时候进行扩容。
里面是一个赋值操作,右边是一个空容量数组,左边则是存储数据的容器,以下是参照源码分析;
//默认空容量数组,长度为0private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//集合真正存储数据的容器transient Object[] elementData;
2.2,参数为指定初始化容量的构造方法
来看看源码中的int型构造方法: