Java的ArrayList和LinkedList

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值