基于数据结构分析java集合——List

1 篇文章 0 订阅
1 篇文章 0 订阅

list是有序集合,在日常应用中常用到的是ArrayList,LinkedList这两个类,其继承关系图如下图所示

ArrayList集合是基于数组实现的,而LinkedList是基于链表实现的。从数据结构分析,数组是使用一组连续的存储空间来存储相同数据类型的数据的,而链表是通过指针记录结点与结点之间的关系的,由此知,在我们内存连续空间不多的情况下存储数据,可以使用LinkedList,再连续空间充足的情况下,可以使用ArrayList存储数据。数据和链表的存储空间图如下所示

从数组存储数据的方式分析,ArrayList可以通过下标进行快速查找数据,如上图中的所示,如果删除第二个值(即下标为1,存储空间为104~107的值),那么第三个值就要移动到第二个值(及下标从3变成2,存储空间从108~111变成104~107),第四个值变成第三个值,如此类推。由此可见,ArrayList比较适合快速访问的应用场景,如果频繁插入删除数据,那么就可以使用LinkedList。

准确来讲,LinkedList是双向列表,存储数据通过前驱指针来绑定前结点,通过后驱指针来绑定后结点,如下图所示,prev表示前驱指针,data表示当前结点,next表示后驱指针,如果要删除其中的某一个结点,那么需要将删除结点的前结点的后驱绑定要删除节点的后结点;将删除结点的后结点的前驱绑定删除节点的前结点的的。由此可见LinkedList不是和快速访问的应用场景,不过适合快速插入的应用场景。

另外,有ArrayList源码可知,它的默认长度为10。

在往ArrayList插入数据时,如果长度超出ArrayList长度,那么ArrayList就要进行扩容,ArrayList容量为原来的1.5倍,下图为ArrayList扩容的部分源码代码。在ArrayList扩容时,会涉及到数据迁移问题,会导致性能消耗,在平时应用中,如果可以确定ArrayList存放的数据量,可以在实例化的时候确定ArrayList的长度,这样可以减少数据迁移的性能开销。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值