在java中ArrayList集合底层的扩容原理
短信预约 -IT技能 免费直播动态提醒
第一章 前言概述
第01节 概述
底层说明
ArrayList是List的实现类,它的底层是用Object数组存储,线程不安全
后期应用
适合用于频繁的查询工作,因为底层是数组,可以快速通过数组下标进行查找
第02节 区别
区别方向 | ArrayList集合 | LinkedList集合 |
线程安全 | 不安全 | 不安全 |
底层原理 | Object类型数组 | 双向链表 |
随机访问 | 支持(实现 RandomAccess接口) | 不支持 |
内存占用 | ArrayList 浪费空间, 底层是数组,末尾预留一部分容量空间 | LinkedList占用空间比ArrayList多,存在头尾地址值占用空间 |
小结
ArrayList 集合的特点:
1. 线程不安全
2. 底层数据结构是数组(查询快,增删慢,支持快速随机访问)
3. 内存占用会存在部分浪费,末尾会预留一部分容量空间
第二章 核心代码
第01节 成员变量
代码
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; // non-private to simplify nested class access
private int size;
}
补充
1. ArrayList 集合底层存在6个成员变量
还有一个 private static final long serialVersionUID = 8683452581122892189L;
序列化使用, 目前针对于当前的操作过程当中, 暂时不会使用得到。
2. ArrayList 集合当中核心的两个成员变量
A. 底层维护数组 transient Object[] elementData;
B. 存储的元素个数 private int size;
第02节 构造方法
代码
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节 扩容代码
核心方法介绍
来自于 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() 方法,比较两个数据最大值,取较大者,返回
核心代码解释
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)];
}
}
}
到此这篇关于在java中ArrayList集合底层的扩容原理的文章就介绍到这了,更多相关ArrayList集合扩容原理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341