ArrayList源码解析
2022/4/14 1:14:22
本文主要是介绍ArrayList源码解析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.无参构造方法
//默认初始长度 private static final int DEFAULT_CAPACITY = 10; //初始空数组 private static final Object[] EMPTY_ELEMENTDATA = {}; //共享空数组 和 EMPTY_ELEMENTDATA 区分用来查看扩容多少 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //list存储数据的数组 transient Object[] elementData; //list长度 private int size; public ArrayList() { //无参构造直接将 初始空数组 赋值给 存值数组 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
2.有参构造
public ArrayList(int initialCapacity) { if (initialCapacity > 0) { //设置的长度大于0,就根据输入的长度创建一个数组给 存值数组 this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { //传入的长度等于0将 共享空数组给 存值数组 this.elementData = EMPTY_ELEMENTDATA; } else { //传入负数抛出异常 throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } }
3.add方法
/** * e 传入的参数 */ public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } /** * minCapacity 当前数组长度+1 */ private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } /** *elementData 存值数组 *minCapacity 当前数组长度+1 */ private static int calculateCapacity(Object[] elementData, int minCapacity) { //判断 存值数组 是 空数组的话 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { //放入初始容量 和 当前数组长度+1 值进行对比 返回数大的 return Math.max(DEFAULT_CAPACITY, minCapacity); } //当 存值数组 不为空的话 返回 当前数组长度+1的值 return minCapacity; } /** *minCapacity 返回的最大长度 */ private void ensureExplicitCapacity(int minCapacity) { modCount++; //返回的最大长度 减去存值数组长度 大于0的话 标识需要扩容 if (minCapacity - elementData.length > 0) //调用扩容方法 grow(minCapacity); } /** *minCapacity 需要扩容的长度 */ private void grow(int minCapacity) { // 将当前数组长度给 oldCapacity int oldCapacity = elementData.length; //当前将数组长度转为二进制 并向右移动一位 转为16进制 加上原来的长度 得到新的长度 //例如:第一次扩容的时候长度是 10 十进制转为二进制 1010 向右移动一位是 101 二进制转为10进制 为5 用5加上原来的长度10 等于15 int newCapacity = oldCapacity + (oldCapacity >> 1); //新长度 减去 需要扩容的长度 小于0 if (newCapacity - minCapacity < 0) //将需要扩容的长度给新长度 newCapacity = minCapacity; //判断新长度是否大于最大长度 最大长度为 int的最大长度-8 int的最大长度为 2正128 if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); //将 存值数组 和 扩容长度放入 复制出一个新的数组给 存值数组 elementData = Arrays.copyOf(elementData, newCapacity); }
4.get方法
public E get(int index) { rangeCheck(index); return elementData(index); } //判断下标是否大于等于数组长度,是的话抛出数组越界 private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
5.set方法
public E set(int index, E element) { //判断下标是否越界 rangeCheck(index); E oldValue = elementData(index); //将新的给下标 elementData[index] = element; //返回旧的值 return oldValue; } private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } //获取对应下标的值 E elementData(int index) { return (E) elementData[index]; }
6.remove方法
public E remove(int index) { //判断下标是否越界 rangeCheck(index); modCount++; //获取原来下标的值 E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue; } private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
E elementData(int index) { return (E) elementData[index]; }
这篇关于ArrayList源码解析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南