ArrayList集合底层扩容原理前言概述对象创建扩容操作第一章 前言概述第01节 概述底层说明ArrayList是List的实现类,它的底层是用Object数组存储,线程不安全后期应用适合用于频繁的查询工作,因为底层是数组,可以快速通过数组下标进行查找第02节 区别区别方向Array集合LinkedList集合线程安全不安全不安全底层原理Object类型数组双向链表随机访问支持(实现 RandomAccess接口)不支持
### ArrayList集合底层扩容原理
前言概述核心代码扩容操作
第一章 前言概述
第01节 概述
底层说明
1 2
| ArrayList是List的实现类,它的底层是用Object数组存储,线程不安全
|
后期应用
1 2
| 适合用于频繁的查询工作,因为底层是数组,可以快速通过数组下标进行查找
|
第02节 区别
区别方向ArrayList集合LinkedList集合线程安全不安全不安全底层原理Object类型数组双向链表随机访问支持(实现 RandomAccess接口)不支持内存占用ArrayList 浪费空间,底层是数组,末尾预留一部分容量空间LinkedList占用空间比ArrayList多,存在头尾地址值占用空间
小结
1 2 3 4 5
| ArrayList 集合的特点: 1. 线程不安全 2. 底层数据结构是数组(查询快,增删慢,支持快速随机访问) 3. 内存占用会存在部分浪费,末尾会预留一部分容量空间
|
第二章 核心代码
第01节 成员变量
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData;
private int size; }
|
补充
1 2 3 4 5 6 7 8
| 1. ArrayList 集合底层存在6个成员变量 还有一个 private static final long serialVersionUID = 8683452581122892189L; 序列化使用, 目前针对于当前的操作过程当中, 暂时不会使用得到。
2. ArrayList 集合当中核心的两个成员变量 A. 底层维护数组 transient Object[] elementData; B. 存储的元素个数 private int size;
|
第02节 构造方法
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } else { this.elementData = EMPTY_ELEMENTDATA; } }
public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } } }
|
补充(一) 无参构造创建对象
补充(二)带参构造创建对象,带有int类型参数
补充(三)带参构造创建对象,带有 集合类型参数
第三章 扩容操作
第01节 扩容代码
核心方法介绍
1 2 3 4 5 6 7 8 9 10
| 来自于 ArrayList 集合当中的方法: 1. public boolean add(E e){ ... } 2. private void add(E e, Object[] elementData, int s){ .... } 3. private Object[] grow() 4. private Object[] grow(int minCapacity)
来自于其他类当中的功能 1. Arrays.copyOf(elementData, newCapacity); 表示来自于 数组工具类 Arrays 当中的 copyOf() 底层使用的是 System.arraycopy() 方法 2. Math.max(DEFAULT_CAPACITY, minCapacity) 表示来自于 数学工具类 Math 当中的 max() 方法,比较两个数据最大值,取较大者,返回
|
核心代码解释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
public boolean add(E e) { modCount++; add(e, elementData, size); return true; }
private void add(E e, Object[] elementData, int s) { if (s == elementData.length) elementData = grow(); elementData[s] = e; size = s + 1; }
private Object[] grow() { return grow(size + 1); }
private Object[] grow(int minCapacity) { int oldCapacity = elementData.length; if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { int newCapacity = ArraysSupport.newLength(oldCapacity, minCapacity - oldCapacity, oldCapacity >> 1 ); return elementData = Arrays.copyOf(elementData, newCapacity); } else { return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)]; } } }
|
第02节 动态过程说明
本文标题: ArrayList集合底层扩容原理
本文作者: csdn
发布时间: 2021年04月15日 08:14
最后更新: 2025年04月03日 11:07
原始链接: https://haoxiang.eu.org/2bc3b515/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!