08-java集合框架之ArrayList和LinkedList和Vector的区别和优缺点

ArrayList,LinkedList和Vector的区别和优缺点

ArrayList、LinkedList和Vector都是实现了List接口。
其中,ArrayList和Vector底层是用数组实现的,因此可以用序号下标来访问他们,查找的效率高,一般数组的大小比要插入的数据大数量要大。
LinkedList的底层使用双向链表实现的,因此插入和删除的效率高。

从使用上说:

ArrayList属于非线程安全,而Vector则属于线程安全。如果是开发中没有线程同步的需求,推荐优先使用ArrayList。因此其内部没有synchronized,执行效率会比Vector快很多。

从数据结构上说:

ArrayList是一个数组结构(Vector同理),数组在内存中是一片连续存在的片段,在查找元素的时候数组能够很方便的通过内存计算直接找到对应的元素内存。但是它也有很大的缺点。我们假设需要往数组插入或删除数据的位置为i,数组元素长度为n,则需要搬运数据n-i次才能完成插入、删除操作,导致其效率不如LinkedList。 LinkedList的底层是一个双向链表结构,在进行查找操作的时候需要花费非常非常多的时间来遍历整个链表(哪怕只遍历一半),这就是LinkedList在查找效率不如ArrayList快的原因。但是由于其链表结构的特殊性,在插入、删除数据的时候,只需要修改链表节点的前后指针就可以完成操作,其的效率远远高于ArrayList。

从多线程环境上说:

三者中只有Vector是线程安全的类,自然ArrayList和LinkedList在多线程中是不安全的,但是Vector在多线程环境下使用不当也是不安全的,安全的也只是它本身而已,在Vector的方法组合使用过程中就会产生线程不安全的情况,当然还有很多种业务逻辑情况下都会造成其不安全,这里不过多赘述.有兴趣的可以自己去实验一下.例如:add方法和contains方法的组合使用在多线程中安全的是这两个方法,不是这两个方法组成的逻辑,这些坑一定要多注意.

public void xxx(Object element){
if (!vector.contains(element)) 
    vector.add(element); 
}
}

就像这种,安全的是add和contains,而不是xxx方法或者这个if域.

总结一个表格如下:

类别ArrayListVectorLinkedList
优点适合查找适合查找适合插入删除
缺点不适合插入删除不适合插入删除不适合查找
继承类AbstractListAbstractListAbstractSequentialList
实现接口List, RandomAccess, Cloneable, SerializableList, RandomAccess, Cloneable, SerializableList, Deque, Cloneable, Serializable
线程安全
数组增量增量50%增量100%或者自定义增量\
数据结构数组数组(适量队列)双向链表
适用场景适用于需要频繁查找元素的场景(单线程)适用于需要频繁查找元素的场景(多线程)适用于需要频繁插入删除元素的场景(单线程)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值