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

来源:互联网 发布:eclipse for java ee 编辑:程序博客网 时间:2024/06/05 15:02

在前面一篇文章中,我们已经谈过了关于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,具体问题,具体分析