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)的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList的源码分析(基于jdk1.8)

Java集合基于JDK1.8的ArrayList源码分析

ArrayList源码分析--jdk1.8

深入ArrayList源码分析(JDK1.8)

AQS源码分析--jdk1.8

ArrayList源码阅读分析(JDK1.8)