ArrayList底层原理

ArrayList是抽象类AbstractList的子类,实现了List接口、RandomAccess(随机访问)等接口
在这里插入图片描述
ArrayList的底层主体就是一个Object数组,对ArrayList的所有底层操作就是基于数组实现的
在这里插入图片描述

1.ArrayList的线程安全性

对ArrayList进行添加操作的时候是分两个步骤进行的,即第一步先在object[size]的位置上存放需要添加的元素,第二步就是将size的值增加1,由于这个过程在多线程的环境下是不能保证具有原子性的,因此ArrayList在多线程的环境下是线程不安全的

2.ArrayList的主要成员变量

  • private final int DEFAULT_CAPACITY=10:当ArrayList的构造方法中没有显式指出ArraList的数组长度时,类内部使用默认的容量大小为10
  • private static final Object[] EMPTY_ELEMENTDATA={}:当ArrayList的构造方法中显式指出ArrayList的数组长度为0时,类内部将EMPTY_ELEMENTDATA这个空对象数组赋给elementData数组
  • private static final Object[] DEFAULT_EMPTY_ELEMENTDATA={}:当ArrayList的构造方法中没有显式指出ArraList的数组长度时,类内部使用默认缺省时对象数组
  • private int size:实际ArrayList中存放的元素的个数,默认时为0

3.ArrayList的构造函数

指定ArrayList数组容量大小:
在这里插入图片描述
当没有显式指定数组容量大小时,指定数组大小为10:
在这里插入图片描述
Collection<? extends E>类型构造方法:
在这里插入图片描述

4.ArrayList的add()方法

在add()方法中主要完成了三件事:

  • 首先判断数组中元素个数是否已经等于数组长度,如果是,则进行扩容操作
  • 然后将元素添加到elementData数组的指定位置
  • 最后将集合中实际的元素个数加1
    在这里插入图片描述

5.ArrayList的扩容机制grow()方法

将可允许的数组的最小容量传过去(最小容量mincapacity=size+1是因为要添加一个元素,所以进行加一操作)
在这里插入图片描述
调用复制copyOf()方法,在原来元素基础上增加容量:
在这里插入图片描述
这里就涉及到扩容最重要的方法:newCapacity()

  • 首先获取数组长度
  • 将数组长度扩容为原数组长度的1.5倍
  • 将新容量和所需最小容量做对比,看到这可能会觉得感到疑惑:最小容量我们知道minCapacity=size+1(此时的size等于length,因为size==element.length才会进行扩容嘛),即数组中元素大小加1,而newCapacity=elementData.length*1.5,按道理来说一个是原来的1.5倍,一个只是+1操作,那肯定是1.5倍那个大,这个比较不就是多余的了吗?这里我们可能会忽略一种非常重要的情况:当数组为空时数组为空又分为两种情况:(1)指定了数组容量为0 (2)没有显式指定数组大小。当数组为空时我们进行插入操作,因为元素个数size为0,数组容量也为0,那么就会进行扩容操作,对于空数组,扩容1.5倍后你的容量还是为0,那么此时就会小于我所需的最小容量(也就是1),所以这里就是针对数组为空的情况,那么对于第一种指定了数组长度为0,它扩容后的容量就是1;对于第二种情况,扩容后的数组长度就是DEFAULT_CAPACITY,也就是10
  • 最后判断新容量大小是否大于默认数组的最大值(Integer.MAX_VALUE-8),则赋予它整型的最大值
    在这里插入图片描述

补充

1.ArrayList和Array的区别是什么

  1. 存储内容比较:Array可以包含基本类型和对象类型,ArrayList只能存储对象类型
  2. 空间大小比较:Array数组的空间大小是固定的,所以需要提前确定合适的空间大小,ArrayList的空间大小是动态增长的,而且存在扩容机制
  3. 方法上的比较:ArrayList比Array更多样化

2.ArrayList和LinkedList的区别是什么

  1. 数据结构实现上:ArrayList的底层是数组,ArraList的底层是双向链表
  2. 随机访问效率上:ArrayList实现了RandomAccess接口,所以支持随机访问,LinkedList不支持随机访问
  3. 增加和删除效率上:在非首尾的增加 和删除操作,LinkedList要比ArrayList高
  4. LinkedList比ArrayList更占空间内存
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值