LinkedList为什么不支持高效的随机访问

LinkedList是由链表实现的,针对元素的插入删除比较高效,但是不支持随机访问,只能一个元素一个元素的遍历,数组根据下标支持随机访问。 这个问题你要是了解了数据结构的话就比较清楚了

LinkedList的实现方式是这样的:

1、LinkedList他在内存里面是离散的,不是连续。

2、LinkedList里面的每一个元素都有下一个元素的引用。

3、当你想插入某个元素的时候,比如:已有一个LinkedList里面是 A B C三个元素(也就是,A的引用里面放着B,B的引用里面放着C,C的引用里面是null)现在你要在A和B之间插入D,他的做法是这样的将A的引用指向D,D引用指向B,B的引用依然指向C,C的引用还是null。

所以他插入的是非常的快,就是改一下引用。

4、当你遍历的时候他会这样做,先将A遍历出来然后找A的引用就是B,再将B遍历出来再找B的引用,将C遍历出来,所以遍历也很快。

下面就是关键的问题了

=====================================================

那关键的问题我想随即访问一个元素,比如说有1W个元素LinkedList,你现在要访问第9999个元素,他是这么访问的,他先将第一个元素拿出来看下不是,然后找A的引用,再将B拿出来还是不是,然后再找,他就这样一直找啊找,找啊找,在他找第9998还是不是在把9998的引用指向的元素拿出,oh year找到了,然后给你。所以他实现随即访问就比较慢了,尤其是找最后一个元素的时候。

随机访问意味着您可以在恒定时间内找到第 i 个元素。更具体地说,它不取决于列表的大小,或者您访问的是第一个元素、最后一个元素还是中间的一个元素。

使用链接列表

您必须遍历从第一个元素到第 i 个元素的所有元素才能找到第 i 个元素。因此,获取最后一个元素比第一个元素花费更多的时间。因此,这不是随机访问。

使用数组

数组中的元素连续存储在内存中。因此,如果您知道A第一个元素的地址,并且每个元素都有一个 size S,那么您就可以直接知道第 i 个元素的地址:A + i*S。此操作对数组中的任何元素都花费相同的时间,并且足以检索它。因此,数组是随机访问的。

猜你喜欢

转载自blog.csdn.net/yzwfeng/article/details/128647791