ArrayList和LinkedList区别
2016-03-27 20:49
211 查看
ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:
性能总结:
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
扩展:
1、ArrayList如果不指定容量,而初始大小为10,动态增长时,增长到当前容量的1.5倍(newCapacity = (oldCapacity * 3)/2 + 1)。
2、与之类似的还有,HashMap的初始大小为16,增长时,直接容量翻番,如源代码。
3、Vector的初始大小为10,如果没有指定每次增长的大小,则默认是翻倍增长(newCapacity = (capacityIncrement > 0) ?(oldCapacity + capacityIncrement) : (oldCapacity * 2))。
性能总结:
– | add()操作 | delete()操作 | insert操作 | index取值操作 | iterator取值操作 |
---|---|---|---|---|---|
ArrayList/Vector/Stack | 好 | 差 | 差 | 极优 | 极优 |
LinkedList | 好 | 好 | 好 | 差 | 极优 |
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
扩展:
1、ArrayList如果不指定容量,而初始大小为10,动态增长时,增长到当前容量的1.5倍(newCapacity = (oldCapacity * 3)/2 + 1)。
2、与之类似的还有,HashMap的初始大小为16,增长时,直接容量翻番,如源代码。
3、Vector的初始大小为10,如果没有指定每次增长的大小,则默认是翻倍增长(newCapacity = (capacityIncrement > 0) ?(oldCapacity + capacityIncrement) : (oldCapacity * 2))。
相关文章推荐
- 导航
- jquery 图片没有路径,不显示图片。
- poj_1005
- 我的C++实践(4):trait与policy模板技术http://blog.csdn.net/zhoudaxia/article/details/4486487
- codeforce 631C report
- 纯代码实现2048各种版本
- char,short,int,long等数据类型
- Unity的二进制热更新
- An asset is marked with HideFlags.DontSave but is included in the build:
- iOS访问https ssl和tls双向加密
- 【ReactJS】一、手把手搭建ReactJS开发环境(Sublime)
- Nginx增加模块
- 北京之旅--国家图书馆
- 【ReactJS】一、手把手搭建ReactJS开发环境(Sublime)
- 剑指offer 反向遍历链表
- MySQL创建用户与授权方法
- 【spring基础】AOP概念与动态代理详解
- Python基础2:反射、装饰器、JSON,接口
- Linux学习笔记——切换并取代用户身份命令——su
- 访问量破3000之记录