一、概述
arraylist是以数组实现。节约空间,但是数组容量有限制。超出限制会主动增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值。默认第一次插入元素时创建的大小为10。
按数组下标访问元素即get(i)/set(i,e)的性能很高,这体现了数组的优势。
直接在数组末尾加入元素即add(e)的性能也很高,但如果按下标插入/删除元素即add(i,e),remove(i),remove(e),则需要用System.arraycopy()来移动部分受影响的元素,性能就变差了,这是基本劣势。
二、官方文档介绍
ArrayList是一个相对来说比较简单的数据结构,更重要的一点就是它的主动扩容,可以认为就是一个“动态数组”。
ArrayList<String> list = new ArrayList<String>();
list.add("语文","90");
list.add("数学","95");
list.add("英语","100");
list.remove(0);
在执行这四条语句时,是这么变化的:
2.1.add函数
当我们在ArrayList中增加元素的时候,会使用add函数,将元素放到末尾
publicbooleanadd(Ee) { ensureCapacityInternal(size+1);//Increments modCount!!elementData[size++]=e;returntrue;}
其中ensureCapacityInternal就是主动扩容机制的核心。也就是说当数组以及不满足需求时,那么就将数组变为原来长度的1.5倍,然后把老的数组copy到新的数组里面。例如一个长度为10的list(其实就是长度为10的数组),当增加了10个元素之后,再次增加时就会自动扩容为15的长度。
2.2set和get函数
get和set操作就是先做index检查,然后在执行赋值操作或访问操作
2.3.remove函数
rangeCheck(index); modCount++;EoldValue=elementData(index);intnumMoved=size-index-1;if(numMoved>0)//把后面的往前移System.arraycopy(elementData, index+1, elementData, index, numMoved);//把最后的置nullelementData[--size]=null;//clear to let GC do its workreturnoldValue;
先做index检查,然后将查找到的删除,之后把该元素后面的元素前移。
感谢原文