写Java的都知道,ArrayList用的比LinkedList多的多,同样是List,这二者有什么区别呢?
1、ArrayList底层是由resizable Array实现的,而LinkedList是由底层的doubly LinkedList实现。(这一点至关重要,下面都是由这一点区别引申出来的)
2、ArrayList有random access功能,即通过index可以以O(1)效率访问任何一个元素;LinkedList不支持random access,必须从端点(一般是第一个节点)开始一个一个找,所以效率是O(n)
3、当插入一个元素的时候,LinkedList可以达到O(1)的效率;ArrayList需要担心底层数组不够大的问题,如果数组不够的话,需要重建一个更大的数组,并且把原来数组的元素一个个地移过去,这属于最坏的情况
4、当ArrayList和LinkedList都排序了的时候,每插入或删除一个元素,ArrayList都需要重新安排所有元素,而LinkedList只需要改动几个指针
5、LinkedList比ArrayList要多消耗一些内存空间,因为ArrayList的每个元素只存储节点本身的值,而LinkedList不止存储节点本身,还需要存储指向前一个元素和后一个元素的指针信息
既然ArrayList底层是由resizable array支持的,那起始时刻底下array的size是多大呢?
查看JDK 6里面ArrayList的源代码,发现空的ArrayList底下是一个存储量为10的空数组。
Constructs an empty list with an initial capacity of ten. public ArrayList() { this(10); }
Increases the capacity of this ArrayList instance, if necessary, to ensure that it can hold at least the number of elements specified by the minimum capacity argument. Parameters: minCapacity the desired minimum capacity public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
什么时候会用到LinkedList?
一般来说,如果不需要random access,并且需要支持特别多的插入和删除操作,并且list的size很大的时候,LinkedList的优势才比较明显,否则还是ArrayList更好用。