Java的ArrayList和LinkedList

来源:互联网 发布:java开发面试题 编辑:程序博客网 时间:2024/05/15 05:38

写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);     }

每次resize的时候,算法是 newCapacity = (oldCapacity * 3)/2 + 1

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更好用。



原创粉丝点击