Java ArrayList初探

一、概述

arraylist是以数组实现。节约空间,但是数组容量有限制。超出限制会主动增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值。默认第一次插入元素时创建的大小为10。

按数组下标访问元素即get(i)/set(i,e)的性能很高,这体现了数组的优势。

直接在数组末尾加入元素即add(e)的性能也很高,但如果按下标插入/删除元素即add(i,e),remove(i),remove(e),则需要用System.arraycopy()来移动部分受影响的元素,性能就变差了,这是基本劣势。

二、官方文档介绍

ArrayList是一个相对来说比较简单的数据结构,更重要的一点就是它的主动扩容,可以认为就是一个“动态数组”。

ArrayList list = new ArrayList();

list.add("语文","90");

list.add("数学","95");

list.add("英语","100");

list.remove(0);

在执行这四条语句时,是这么变化的:

Java ArrayList初探_第1张图片
图解

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检查,然后将查找到的删除,之后把该元素后面的元素前移。


感谢原文

你可能感兴趣的:(Java ArrayList初探)