<强> 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的工作原理详解