RandomAccess接口标识特定的java.util.List实现具有快速随机访问。 该接口试图定义一个不精确的概念:快速有多快? 该文档提供了一个简单的指南:
if repeated access using the List.get() method is faster than repeated access
using the Iterator.next() method, then the List has fast random access.
以下代码示例显示了两种访问方式:
Object o;
for (int i=0, n=list.size(); i < n; i++)
o = list.get(i);
Object o;
for (Iterator itr=list.iterator(); itr.hasNext(); )
o = itr.next();
当list.get()方法比重复访问快时,List如何进行快速随机访问
使用Iterator.next()方法。
哪种超通用列表实现实现RandomAccess? 它的javadoc说什么?
我相信OP是指确实实现RandomAccess的ArrayList。
除非合同另有规定,否则接口绝不会对时间复杂性造成任何限制。
"快速"意味着不精确的性质是我们拥有算法复杂性(又称为"大O"表示法)的原因。随机访问意味着get运算的算法复杂度为O(1),对于ArrayList为真。相反,对LinkedList的get操作的算法复杂度为O(n)。
How does the List has fast random access when its list.get() method is faster than repeated access using the Iterator.next() method.
仅建议使用list.get()的速度快于iterator.next()的情况将其标记为使用RandomAccess进行快速随机访问。编程特定List实现的程序员仍然必须选择使其List实现RandomAccess。
可以理解,因为list.get(i)将直接查询数据,所以这样的方法调用会比iterator.next()更快(对于具有良好随机访问的List而言),因为下一个方法可能会增加其他方法的开销方法调用和其他逻辑。如果迭代器速度更快,那么您可能可以安全地打赌,这是因为List没有良好的随机访问,并且迭代器速度更快,因为它使用了一种从节点到节点的优化方法(例如List的迭代器实现可能具有一定的访问权限)到通常是其他类专用的基础List数据)。
该示例代码确实有点误导,因为与基于迭代器的解决方案的比较有损于实际情况:
当List#get(int)方法具有恒定的渐近运行时间时,列表应实现RandomAccess接口! (以大O表示法写为O(1))。
考虑一个ArrayList:内部存储在数组中的数据。调用arrayList.get(1)将花费与调用arrayList.get(100000)相同的时间。
与此相反:LinkedList不提供RandomAccess。尽管您仍然可以调用linkedList.get(1)和linkedList.get(100000),但后者将花费更长的时间,因为它必须遍历整个列表,直到到达第100000个元素。
有一种方法可以在链表上实现O(log n)(最坏的情况)随机访问。
该方法与跳过列表,冈崎的列表和Haskell的树没有任何关系。
它已经在这里提出。
欢迎@STRIP! 您能否将您提供的链接的相关部分直接添加到答案中? 谁知道...更容易获得完整答案,将来链接可能会失效。
晚上好,@ gmauch! 我希望LinkedIn将来不会失败。 这篇文章-在LinkedIn中-大约40页,不包括所有原始数据和图表:在这里复制该文章有点困难(或者-也许-我不正确理解您的要求)。 这篇文章的扩展链接是:linkedin.com/pulse/