系列文章目录
1.集合-Collection-CSDN博客
2.集合-List集合-CSDN博客
3.集合-ArrayList源码分析(面试)_喜欢吃animal milk的博客-CSDN博客
目录
系列文章目录
前言
一 . 什么是ArrayList?
二 . ArrayList集合底层原理
总结
前言
大家好,今天给大家讲一下ArrayList底层的扩容机制
一 . 什么是ArrayList?
ArrayList 是 List 接口的实现类之一,它是基于动态数组实现的,可以根据需要自动调整大小。ArrayList 具有以下特点:
- 有序性:ArrayList 中的元素是有序的,可以根据插入的顺序进行访问和操作。
- 可重复性:ArrayList 允许存储重复的元素。
- 动态调整大小:ArrayList 内部使用数组来存储元素,当元素数量超过当前数组容量时,ArrayList 会自动进行扩容,以容纳更多的元素。
- 随机访问:由于 ArrayList 使用数组来存储元素,因此可以通过索引来直接访问元素,具有较快的随机访问速度。
- 线程不安全:ArrayList 不是线程安全的,如果在多个线程同时对 ArrayList 进行修改操作,可能会导致不可预期的结果。
拓展: ArrayList和vector的区别
本质上两者没什么区别,不同的是vector是线程安全的,Arraylist是线程不安全的,两者在扩容时,扩容的空间不同,其余的两者完全一致,只不过vector使用的很少,了解即可
在ArrayList中我们没有额外的方法需要学习,它的方法直接继承自List接口
二 . ArrayList集合底层原理
public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc"); }
上面代码中利用无参构造方法创建ArrayList的对象,底层会创建一个默认长度为零的数组element
在添加第一个元素的时候,size==emlment.length==0 会调用扩容方法grow
说到这了,给大家解释一下size
私有化成员变量,没有初始化,默认值为0
size有两个含义: 1. 表示当前数组中元素的个数 2. 表示下一个元素的存入位置
ok 我们来看一下grow方法
如果容量不足,且不是第一次扩容
就会调用newLength方法计算扩容后的容量的大小
这个时候可能就会有人提出疑问了? 我一个一个元素的添加怎么可能会让minGrowth>prefGrowth?
其实Arraylist集合中还有一个addAll方法
ArrayList 类提供了 addAll(Collection<? extends E> c) 方法,用于将指定集合中的所有元素添加到列表的末尾。该方法的参数是一个集合,可以是 ArrayList、LinkedList 或其他实现了 Collection 接口的类的实例。
这样一来minGrowth是不是就有可能比prefGrowth大了
newlength方法返回值处的三目运算符本质上就是去判断prefLength是否越界(int的最大值),了解即可。
总结:
总结
大家好好理解,下一篇博客见。