基于索引,随机访问和顺序访问之间的区别?

时间:2017-03-04 17:01:31

标签: java collections linked-list random-access indexed

据我说:

基于索引:可以通过传递索引来访问它。现在内部它正在进行随机或顺序迭代并不重要。

随机访问:您可以随机访问该位置。

顺序访问:从其他位置开始依次逐个访问所需位置。

但是在采访中我说LinkedList是基于java的索引,因为它提供了所有方法add(int index,obj),get(int index),remove(int index)。人们不接受。然后我说基于索引和随机访问是两个不同的概念。我是对的吗?

3 个答案:

答案 0 :(得分:8)

所以,这个问题比看起来有点棘手,因为这些术语的适当性确实取决于上下文,正如JB Nizet在下面的评论中强调的那样,这实际上归结为一个术语问题,而不是实现问题或者实际的概念,所以这个答案主要是关于短语的迂腐。首先,您的定义是:

  
      
  • 基于索引:可以通过传递索引来访问。现在内部它正在进行随机或顺序迭代并不重要。
  •   
  • 随机访问:您可以随意访问某个位置。
  •   
  • 顺序访问:从其他某个位置开始依次逐个访问所需位置。
  •   

首先照顾这一部分:“基于索引的”并不属于那里。术语“基于索引”并不真正识别访问类型或任何东西,它只是意味着......“基于索引”。它只是一个可以形容某事的任意形容词。在谈论一般访问类型时,我们只讨论随机和顺序。通常,“基于索引的访问”意味着/是“随机访问”的同义词。 如果存在“随机访问”样式界面,可能它使用索引,也许它使用其他东西,谁知道,它并不重要。因此,让我们从那里的术语列表中“基于索引”。

如果这没有多大意义,可以这样想:你的列表“基于索引”,“随机访问”,“顺序访问”,类似于“磁性”,“金属椅子”,“木椅“,分别。第一个只是一个形容词,而不是一种类型的椅子,如果你在谈论椅子,那么它就意味着“金属椅子”而对“木椅”没有意义。

现在,至于LinkedList,只是以列表的形式表达几个点,而不是特别顺序:

  • LinkedList实现List界面,因此支持随机访问(通过get(int)和朋友)。
  • LinkedList 支持来自iterator()界面(Collection扩展)的顺序访问(来自List)。
  • 它遵循Java中的所有 List(无论是LinkedListArrayList等等。)支持都是随机的和顺序访问。

所以说LinkedList 支持(或“允许”或任何你喜欢的词语)随机访问,并且支持顺序是正确的访问。

另一方面,您可以谈谈complexity /实施细节:

    由于链表的性质,
  • LinkedList非常适合顺序访问。
  • LinkedList随机访问是O(n)最坏的情况,因为它必须通过顺序迭代实现。你不能跳转到特定的索引,而是必须从头开始并迭代。

所以:

  

但是在采访中我说LinkedList是基于java索引的,因为它提供了所有方法add(int index,obj),get(int index),remove(int index)。人们不接受。然后我说基于索引和随机访问是两个不同的概念。我是对的吗?

不完全是。如上所述,“基于索引的访问”通常是“随机访问”的同义词,或者至少暗示它,但“基于索引的”本身并不是一件事。这里只有“随机”和“顺序”。

关于LinkedList您可以说的是:

  • 支持基于索引的随机访问。
  • ArrayList相比,它没有良好的随机访问性能。
  • 非常适合顺序访问。

无法说的是LinkedList 基于索引”。虽然List的随机访问接口是基于索引的,但是说“链表的实现是基于索引的”或“链表是基于索引的”并没有多大意义。 ,因为链表不是基于索引,这与Java的实现恰好提供随机和顺序访问接口这一事实无关。

此外,您并没有真正说“链接列表随机访问”或“链接列表 顺序访问”。在语义上,这些短语没有多大意义。链表是一个链表,它具有较差的随机访问性能,Java为它提供了随机和顺序访问接口,但列表本身通常不被称为“是”其中之一。

所以你的面试答案可能是“嗯,LinkedList通过List界面支持基于索引的随机访问,但其性能不如ArrayList和顺序访问更为理想。“

希望有所帮助。

答案 1 :(得分:1)

你部分正确。 “随机”访问被错误地命名;它实际上是任意访问,换句话说,与索引访问相同。索引和顺序访问是不同的,但不是互斥的。我们说他们是正交;你既不能,也不能两者兼得。

索引(“随机”)访问意味着您可以随意到达任何位置,例如(伪代码)knickknacks[17]knickknacks["paddywhack"]

顺序访问意味着从一些起始位置到某一端逐个遍历集合。

for (Paddywhack aBone : knickknacks) {
  give(theDog, aBone);
}

List个实例支持这两种模式。 Set个实例支持containsremove的索引访问权限;仅通过iterator和for-each循环进行检索的顺序访问。

答案 2 :(得分:0)

在这里你可以指出逻辑,也可以参考图像....

ArrayList-Random(索引)访问,传递随机索引和获取元素。

LinkedList-顺序访问,获取将具有引用的第一个/最后一个元素            到下一个/上一个元素。

enter image description here