原创

再论JAVA中核心数据结构——List

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://xxlcube.blog.csdn.net/article/details/8172860

在前面一篇文章中,我们已经谈过了关于List的相关内容

下面我们再一次讨论下List


我们来主要看看最常用的3种List实现——ArrayList,Vecotr,LinkedList

ArrayList和Vector都是数组实现的,内部几乎采用了相同的算法,唯一区别是ArrayList没有对任何一个方法做线程同步,也就是没有使用synchronized关键字,而Vecotr是采用线程安全的,所以从理论上来说,ArrayList的性能要稍稍好于Vector,但实际中并不是很明显。


LinkedList是采用双向循环链表实现的,查询较慢,插入,删除较快,但是还得看具体位置


1、插入元素在列表尾部

这无疑是ArrayList更快,因为数组插在尾部,不需要做任何的数据组复制操作,也就是数组的元素移动操作;而LinkedList,header元素的前驱正好是最后一个元素,所以直接插入到header之前就可以了。

还有一点,ArrayList是数组实现的,那么在定义时,必然有初始化数组大小,JAVA中ArrayList初始化默认大小是10,超过则自动扩容至原大小1.5倍,一旦扩容就需要进行数组的整体内存复制,比较耗时,所以认为初始化大小很关键;而LinkedList没有容量大小的概念。

2、插入元素在列表任意位置

当然LinkedList更快了,不用多说了

3、删除任意位置的元素

这个就需要具体看该元素所处的位置了

-->头部:LinkedList更快,只需修改指针指向,遍历最少

-->尾部:LinkedList更快,只需修改指针指向,遍历最少,因为是双向循环列表,通过Header可以直接找到尾部

-->中间:ArrayList更快,因为几乎要遍历完整个List才能找到该元素,主要时间都是花在遍历元素上,真正删除还是很快的


ArrayList的扩容操作还是需要大家注意的

总结一句就是:

多查询,用ArrayList,多增删,用LinkedList,具体问题,具体分析

文章最后发布于: 2012-11-12 09:50:20
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 酷酷鲨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览