Java集合框架 | ArrayList、Vector、LinkedList(一)


theme: channing-cyan

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

ArrayList 、Vector、LinkedList作为三种常见的集合类,都实现了List接口(List接口继承了Collection接口),那么三者有什么区别呢?

List.png

一、ArrayList和Vector比较

为什么要先来比较ArrayList和Vector的区别呢?最重要的是它们都是有序集合,即存储再这两个集合中的元素的位置都是有序的,区别于数组本身,两者都是动态的,我们使用两者时,都可以按位置索引取出某个元素,同时两者都允许存储的数据是重复的。

那么两者的主要区别是什么?

从同步性讲

Vector是线程安全的,所谓线程安全,即代表在多线程访问共享资源时,能同时保证原子性、可见性、顺序性。Vector线程安全的实现方式是用到了synchronized关键字,关于这个关键字原理,我在文章《面时莫慌 | 一文带你认知不一样的Synchronized》有讲到,感兴趣的朋友,欢迎去浏览。

而对于ArrayList,它是线程不安全的,整个实现没有引入任何对共享资源加锁的机制。

所以在多线程环境下,建议使用Vector,这样我们不用再自己去考虑和编写线程安全的代码逻辑。在非多线程环境下,建议使用ArrayList,这样可以提升效率,减少不必要的加锁成本。

从数据增长讲

ArrayList和Vector 都用一个初始的容量大小,当存储它们里面的元素超出阈值,就需要增加两个集合的分别的存储空间,每次需要增加存储空间时,考虑到扩容的成本, 不是只增加一个存储单元,而是增加多个存储单元,要达到的目的是,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡

如果存储的元素数量超过当前数组的容量,ArrayList 将增加当前数组大小的50% ,而Vector将增加100%。即ArrayList增加原来的0.5倍,Vector增长为原来的1倍。

从遍历方式讲

Vector可以同时使用EnumerationIterator两种方式遍历元素,而ArrayList只能使用Iterator迭代器的方式遍历。

主要的区别上面讲完了,那么我们如何选择ArrayList和Vector呢?

  • Vector是线程安全的,而ArrayList不是,所以一般情况下,单线程使用ArrayListd多线程使用Vector。
  • 如果我们不知道将会有多少数据,但是知道数据的增长速度,Vector有更大的优势,因为它可以设置扩容的增长值。
  • ArrayList做更新操作更快,如果没有特殊的需求,建议使用ArrayList。

需要的注意的是,Vector作为一个很早期的线程安全的动态数组列表,实际上有很多替代方式,比如

  • Collections.synchronizedList
  • CopyOnWriteArrayList 未完待续,明天整体分析三者的区别!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值