Java中ArrayList的工作原理详解

  

<强> 1. arraylist

  

以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组。因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组。按数组下标访问元素- (i),组(i, e)的性能很高,这是数组的基本优势。如果按下标插入元素,删除元素的东西(i, e)、删除(i)、删除(e),则要用System.arraycopy()来复制移动部分受影响的元素,性能就变差了。越是前面的元素,修改时要移动的元素越多。直接在数组末尾加入元素,常用的添加(e),删除最后一个元素则无影响。

  

ArrayList是一个相对来说比较简单的数据结构,最重要的一点就是它的自动扩容。

  

<强> 2。构造方法

  

ArrayList提供了三个构造方法:

        ArrayList (int initialCapacity):指定容量   ArrayList():构造一个默认容量为10的ArrayList   ArrayList (Collection<& # 63;E>延伸;c):构造一个指定集合的ArrayList      

<强> 3.添加

     //添加指定元素到列表末尾   公共逻辑加(E E) {//检查是否需要扩容   ensureCapacityInternal(+ 1)大小;//增加modCount ! !//赋值   elementData(大小+ +)=e;   返回true;   }   私人空间ensureCapacityInternal (int minCapacity) {   如果(elementData=https://www.yisu.com/zixun/=DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//比较默认的容量10和传入的容量,返回大点的数   minCapacity=数学。马克斯(DEFAULT_CAPACITY minCapacity);   }//扩容   ensureExplicitCapacity (minCapacity);   }   私人空间ensureExplicitCapacity (int minCapacity) {//记录修改次数   modCount + +;//overflow-conscious代码   如果(minCapacity - elementData。长度> 0)   成长(minCapacity);   }   私人空间增长(int minCapacity) {//overflow-conscious代码//记录当列表前的容量   int oldCapacity=elementData.length;//扩展为原来的1.5倍   int newCapacity=oldCapacity + (oldCapacity> 1);//如果扩展1.5倍还不能满足,直接扩展为需求值   如果(newCapacity minCapacity <0)   newCapacity=minCapacity;   如果(newCapacity - MAX_ARRAY_SIZE> 0)   newCapacity=hugeCapacity (minCapacity);//minCapacity通常是接近的大小,这是一个胜利:   elementData=数组。copyOf (elementData newCapacity);   }   之前      

也就是说,当增加数据的时候,如果ArrayList的大小已经不满足需求时,那么数组大小就会变为原来的1.5倍,之后就是把老的数据拷贝新的数组里面。例如我创建的列表的容量时,当我们已经添加了10个元素的之后,再添加就会进行自动扩容到15。

  

        公共E (int指数){   rangeCheck(指数);   返回elementData(指数);   }   公共E组(int指数E元素){   rangeCheck(指数);   E oldValue=https://www.yisu.com/zixun/elementData(指数);   elementData(指数)=元素;   返回oldValue;   }   之前      

get()和set()就比较简单了,进行范围检查后就可以进行对应的操作了。由于ArrayList是动态数组,所以我们完全可以根据下标来获取ArrayList中的元素,而且速度还比较快,故ArrayList长于随机访问。

  

        公共E删除(int指数){   rangeCheck(指数);   modCount + +;   E oldValue=https://www.yisu.com/zixun/elementData(指数);   int numMoved=大小-指数- 1;   如果(numMoved> 0)   系统。arraycopy (elementData、索引+ 1 elementData指数,   numMoved);   elementData[——大小]=零;//清楚让GC做它的工作   返回oldValue;   }   之前      

remove()首先进行范围检查,然后计算移动的开始位置,如果大于0的话就进行移动并返回旧值
  

  

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!

Java中ArrayList的工作原理详解