ArrayList源码分析(基于JDK1.8)
Posted scru
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList源码分析(基于JDK1.8)相关的知识,希望对你有一定的参考价值。
ArrayList底层是一个Object类型数组 。对数组的所有增删改查操作都是基于数组的。
ArrayList的属性
//默认初始化容量是10 private static final int DEFAULT_CAPACITY = 10; private static final Object[] EMPTY_ELEMENTDATA = {}; //ArrayList默认初始化大小 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //ArrayList里存放的所有元素 private transient Object[] elementData; //实际大小 private int size; //记录ArrayList被修改的次数 protected transient int modCount = 0; //最大数组容量 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
构造函数
//无参构造函数 public ArrayList(){ this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } //带参构造函数 public ArrayList(int capcity){ if(capcity > 0){ this.elementData = new Object[capcity]; }else if(capcity == 0){ this.elementData = EMPTY_ELEMENTDATA; }else{ throw new IllegalArgumentException("illegal capacity" + capcity); } }
增加元素
ArrayList增加元素即把元素插入到数组最后一个元素的后面。插入前,先判断数组当前容量是否需要扩容。扩容完毕,插入即可。
public boolean add(E e) { // 添加元素 ensureCapacityInternal(size + 1); // 扩容 elementData[size++] = e; return true; } private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { // 判断元素数组是否为空数组 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); // 取较大值 } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { // 结构性修改加1 modCount++; if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { int oldCapacity = elementData.length; // 旧容量 int newCapacity = oldCapacity + (oldCapacity >> 1); // 新容量为旧容量的1.5倍 if (newCapacity - minCapacity < 0) // 新容量小于参数指定容量,修改新容量 newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) // 新容量大于最大容量 newCapacity = hugeCapacity(minCapacity); // 指定新容量 // 拷贝扩容 elementData = Arrays.copyOf(elementData, newCapacity); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE)? Integer.MAX_VALUE: MAX_ARRAY_SIZE; }
以上是关于ArrayList源码分析(基于JDK1.8)的主要内容,如果未能解决你的问题,请参考以下文章