全面解析ArrayList,超详细!

本文深入剖析了ArrayList的数据结构特点、构造方法及关键操作如添加、删除等方法的实现原理,并对比了ArrayList与LinkedList的区别。

写在前面:

小伙伴儿们,大家好!上一篇我们介绍了HashMap相关知识点——了解HashMap数据结构,超详细!

今天来学习ArrayList相关内容,作为面试必问的知识点,来深入了解一波!

思维导图:

ArrayList学习图

1,ArrayList底层数据结构

ArrayList就是动态数组,是List接口的可调整大小的数组实现;除了实现List接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组大小。它的主要底层实现是数组Object[] elementData

数组的特点大家都知道,遍历查询速度快——数组在内存是连续空间,可以根据地址+索引的方式快速获取对应位置上的元素。但是它的增删速度慢——每次删除元素,都需要更改数组长度、拷贝以及移动元素位置。

ArrayList类架构图

ArrayList 是 java 集合框架中比较常用的数据结构了。继承自 AbstractList ,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccessCloneableSerializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。

ArrayList类似的是LinkedList,但是LinkedList底层是链表,它的数组遍历速度慢,但增删速度很快。

小结:

ArrayList底层是数组实现的存储,查询效率高,增删效率低。

2,ArrayList构造方法

下面是查看API中构造方法

构造方法

2.1,无参构造方法

我们看源码中的无参构造方法:

无参构造,使用默认的size为10的空数组,在构造方法中没有对数组长度进行设置,会在后续调用add方法的时候进行扩容。

无参构造

里面是一个赋值操作,右边是一个空容量数组,左边则是存储数据的容器,以下是参照源码分析;

//默认空容量数组,长度为0
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

//集合真正存储数据的容器
transient Object[] elementData; 

2.2,参数为指定初始化容量的构造方法

来看看源码中的int型构造方法:

指定初始化容量构造

参数大于0,elementData初始化为initialCapacity大小的数组;参数等于0,elementData初始化为空数组;参数小于0,抛出异常;

2.3,参数为Collection类型的构造方法

来看看构造方法的源码:

Collection类型构造

将一个参数为Collection的集合转变为ArrayList(实际上就是将集合中的元素换为了数组的形式);如果传入的集合为null会抛出空指针异常。c.toArray()可能不会正确地返回一个 Object[]数组,那么使用Arrays.copyof()方法。如果集合转换成数组之后数组长度为0,那就直接使用自己的空成员变量初始化elementData

总结:

上面的构造方法理解起来比较简单,无参构造和初始化容量构造的目的都是初始化底层数组elementData(this.elementData=XXX)

无参构造方法会将

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值