java调用list中的数据结构_再论JAVA中核心数据结构——List

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值