ArrayList 原理剖析

ArrayList 是 Java 中用于动态扩容的数组,解决了数组不能自动扩容的问题。文章详细介绍了 ArrayList 的增删查改操作,包括扩容机制、删除方法(如 System.arraycopy 的使用)、查找和修改元素的过程。此外,还讨论了 ArrayList 的优缺点,如非线程安全,以及如何通过 Collections.synchronizedList 或 CopyOnWriteArrayList 实现线程安全。
摘要由CSDN通过智能技术生成

前言

在了解这个类之前,先了解它解决了什么问题。ArrayList 的出现是为了解决数组无法动态扩容的缺陷,使用 java 的数组需要在创建数组时便确定数组的容量,因为数组本身不会自动扩容。对于元素数量不确定的场景如果使用数组则需要预估所需的数组容量,如果估少了还需要重新申请空间并对原数组进行拷贝。这些代码逻辑在每一个用到数组的场景都需要重复进行处理,所以 ArrayList 对这部分重复编码的逻辑进行了封装,实现了动态扩容的效果。

既然 ArrayList 解决了数组扩缩容问题,那么其就相当于是一种创新型的数据结构,对应的它也需要解决好增删查改的问题,后面我们就从增删查改四个维度看一下它的实现方案。

增删查改

Add 数据的第一步是创建 ArrayList,其有三个构造函数,分别是用指定容量创建,无参构造创建和使用别的 Collection 来创建新的 ArrayList。这其中如果采用无参构造创建那么默认的 elementData 会被设置成 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,这是一个空数组,你会发现它和 EMPTY_ELEMENTDATA 这个空数组被区分开了,其目的是为了判断出如果以无参构造创建 ArrayList,那么第一次添加元素时数组最小容量会被设置为 DEFAULT_CAPACITY,也就是下面这段代码控制。

private int newCapacity(int minCapacity) {
   
    // ...
    // 这里会判断是不是默认容量空数组,是的话最小容量会用 DEFAULT_CAPACITY
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
        return Math.max(DEFAULT_CAPACITY, minCapacity
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值