核心数据结构-List接口

List是重要的数据结构之一,其主要有三种实现:ArrayList、Vector、LinkedList,关系如下:

   在这三种实现中ArrayList和Vector使用数组实现,可以认为,ArrayList或者Vector封装了对内部数组的操作。

   ArrayList和Vector几乎使用了相同算法,它们唯一的区别可以认为是对多线程的支持。ArrayList没有对任何一个方法做现成同步,因此不是现成安全的。Vector中绝大部分方法都做了线程同步,是一种线程安全的实现。因此ArrayList和Vector的性能相差无几。从理论上说没有实现线程同步的ArrayList要稍好于Vector但实际表现并不是非常明显。

   LinkedList使用了双向循环链表数据结构。Linked链表由一系列表项连接而成,一个表项总是包含三部分,元素内容、前驱表项和后驱表项。在JDK的实现中,无论LinkedList是否为空,链表内部都有一个header表项,它即表示链表的开始,也表示链表的结尾。表项header的后驱表项便是链表中的第一个元素,表项header的前驱表项便是链表中的最后一个元素。

ArrayList与LinkedList比较:

因为ArrayList是基于数组实现的,因此在不进行扩容的情况下(即ArrayList中容量足够大)添加或通过下标获取元素的效率要优于LinkedList。但是当ArrayList对容量的需求超过当前数组的大小时,将需要进行扩容,扩容过程中会进行大量的数组复制,而数组复制时最终将调用System.arraycopy(),因此在不进行扩容的情况下ArrayList的添加操作效率还是相当高的。

而LinkedList由于使用了链表结构,因此不需要维护容量大小,从这点上说它比ArrayList有一定性能优势,然而,由于LinkedList中维护这一个Entry对象,每次的元素增加都要新建一个Entry对象,并进行过更多的赋值操作,在频繁的系统调用中会对性能产生一定影响。

当增加元素到列表任意位置时ArrayList与LinkedList存在一定差异,由于ArrayList是基于数组实现的,而数组是一块连续的内容空间,如果在数组的任意位置插入元素,会导致在该位置的所有元素需要重新排列,因此效率会比较低,并且插入元素的位置越靠前效率越低。而对于LinkedList来说,在List任意位置插入数据与在尾端插入数据是一样的,因此不会因为插入元素的位置而受到影响。

当删除任意位置元素时ArrayList同样需要进行数组重组,并且删除的元素位置越靠前,数组重组时的开销也越大,删除的元素位置越靠后,开销越小。而LinkedList实现中,首先通过循环找到删除的元素,如果要删除元素的位置处于List的前段,则从前向后找,如果处于后半段,则从后向前找,因此无论要删除较为靠前的元素还是靠后的元素效率都是非常高的,但要移除List中间的元素几乎要遍历完半个List,在List中拥有大量元素时效率很低。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值