This article表示LinkedList中存在“无随机访问”。任何人都可以向我解释一下吗?
鉴于
LinkedList<String> l = new LinkedList<>();
然后我可以用,
l.get(n);
鉴于此,为什么文章说“没有随机访问”?
答案 0 :(得分:8)
此处的随机访问意味着您无法直接访问链接列表中与数组类似的任何元素。
在链接列表中,您必须从头部开始traverse
每个元素(链接),然后您才能访问该元素。
l.get(n);
此方法在后台也可以采用相同的方式。它从头部遍历,然后检索nth
元素
答案 1 :(得分:2)
随机访问意味着您可以在常量时间中找到第i个元素。更具体地说,它不取决于列表的大小,或者您是访问第一个元素,最后一个元素还是中间元素。
使用链接列表
你必须遍历从第一个元素到第一个元素的所有元素才能找到第i个元素。因此,获得最后一个元素比第一个元素花费更多的时间。因此,这不是随机访问。
使用数组
数组中的元素连续存储在内存中。因此,如果您知道第一个元素的地址A
,并且每个元素的大小为S
,则直接知道第i个元素的地址:A + i*S
。对于数组中的任何元素,此操作需要相同的时间,并且足以检索它。因此,数组是随机访问。
答案 2 :(得分:1)
当我们说关于java集合时,它意味着它没有实现RandomAccess接口
您可以在此处进一步了解 RandomAccess
答案 3 :(得分:1)
javadoc writes:
List和Deque接口的双链表实现。实现所有可选列表操作,并允许所有元素(包括null)。
所有操作的执行都与双向链表一样。索引到列表中的操作将从开头或结尾遍历列表,以较接近指定索引为准。
也就是说,即使LinkedList提供了一种访问第i个元素的方法,该方法也会在内部遍历列表,直到它到达该元素,因此效率低下。
这可能就是你的教程所说的“无随机访问”。
相比之下,ArrayList
基于数组,其中第i个元素可以直接访问,或者正如其javadoc所说:
size,isEmpty,get,set,iterator和listIterator操作以恒定时间运行。添加操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。所有其他操作都以线性时间运行(粗略地说)。与LinkedList实现相比,常数因子较低。
一般来说,java.util.LinkedList
很少被使用,因为ArrayList需要更少的内存,可以更快地迭代,并支持索引的高效访问。这并不意味着链表(数据结构)是无用的,只是它们的主要优点(保持对列表元素的引用,可能删除该元素或在其附近添加新元素的能力)不允许java.util.LinkedList
,因为并发器因并发修改而失效。
简而言之:您可能会忘记LinkedList
,只需在需要ArrayList
时使用List
。
答案 4 :(得分:0)
您将从头开始并遍历到 n 并且它不是随机访问! 这是从头部到N
的遍历方法Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
答案 5 :(得分:0)
如果使用get(n),它会跳过列表中的前n-1个元素。如果index = n / 2,则搜索从列表的末尾开始。
答案 6 :(得分:0)
LinkedList(单链接,双链接或根本不链接)可以具有最坏情况O(log2(n))的随机访问。 这可以通过一种新算法来获得,该算法的潜力在本文中介绍:Random Access List