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

标签 java collections linked-list random-access indexed

据我说:

基于索引:可以通过传递索引来访问。现在内部进行随机或顺序迭代无所谓。

随机存取权:您可以随机存取进行中的头寸。

顺序访问:从其他位置开始,一个接一个地顺序访问所需位置。
但是在采访中我说LinkedList是基于Java的索引,因为它提供了所有方法add(int index,obj),get(int index),remove(int index)。人们不接受。然后我说基于索引的访问和随机访问是两个不同的概念。我对吗?

最佳答案

因此,这个问题比看起来要棘手,因为这些术语的适当性确实取决于上下文,并且正如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,并且顺序访问更为理想。”

希望能有所帮助。

关于java - 基于索引,随机访问和顺序访问之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42598716/

相关文章:

java - 随机排列数组列表

mongodb - 获取所选文档在集合中的位置 [mongoDB]

data-structures - 使用数组实现链表 - 优点和缺点

c++ - 程序有时会崩溃

c - 在循环中使用 free() 从文件创建链接列表时出现问题

java - Android 两个网络同时操作

java - 如何使用 MD5 哈希值比较电子邮件

java - 将(“decimal(32,9)”转换为输入值0的科学值0E-9

java - 将字符串中的字符替换为 "divider"

java.lang.OutOfMemoryError : Java heap space 错误