大家每天都在用List。一般来说,ArrayList应该是程序员使用最多的集合类了。今天来研究一下ArrayList。一般来说,从底层数据结构或源代码的角度来看,List比Map或Set简单。底层数据结构ArryList其实是一个变长数组。初始化时,可以指定容量。如果不指定capacity,ArrayList会被初始化为一个空数组,capacity会在第一次存储数据时进行初始化。最小初始容量为10。ArrayList容量控制ArrayList每次存入数据时,首先检查容量:privatevoidensureExplicitCapacity(intminCapacity){modCount++;//溢出意识代码if(minCapacity-elementData.length>0)grow(minCapacity);}如果ArrayList的容量不能满足本次数据存储的要求,调用grow方法扩容:privatevoidgrow(intminCapacity){//溢出意识代码intoldCapacity=elementData.length;intnewCapacity=oldCapacity+(oldCapacity>>1);如果(newCapacity-minCapacity<0)newCapacity=minCapacity;如果(newCapacity-MAX_ARRAY_SIZE>0)newCapacity=hugeCapacity(minCapacity);//minCapacity通常接近大小,所以这是一个胜利:elementData=Arrays.copyOf(elementData,newCapacity);}grow方法首先检查原始容量是否可以扩展1.5倍以满足要求。展开后调用Arrays.copyOf(elementData,newCapacity)将旧数据复制到新展开的数组中。Arrays.copyof方法实际上调用了System.arraycopy方法来完成拷贝。存储数据并调用add(Ee)方法在ArrayList的末尾追加数据。调用addAll(Collectionc)将集合c中的所有数据附加到ArrayList的末尾。ArrayList支持向其指定位置追加数据(通过调用方法add(intindex,Eelement)),底层通过调用System.arraycopy方法实现。如果你研究过ArrayList的源码,你会发现其中大量使用了System.arraycopy方法。因此,ArrayList虽然实际上是数组操作,但是性能并不算太差。在使用ArrayList获取数据的时候,我们对于获取数据一般有两个需求。一种是通过get(intindex)方法获取指定位置的数据。因为ArrayList其实就是一个数组,所以在指定位置获取数据的效率是非常高的。高,时间复杂度为O(1)。另一种是判断某个数据是否包含,调用contains(Objecto)方法:publicbooleancontains(Objecto){returnindexOf(o)>=0;}publicintindexOf(Objecto){if(o==null){for(inti=0;i
