据我说:
基于索引:可以通过传递索引来访问它。现在内部它正在进行随机或顺序迭代并不重要。
随机访问:您可以随机访问该位置。
顺序访问:从其他位置开始依次逐个访问所需位置。
但是在采访中我说LinkedList是基于java的索引,因为它提供了所有方法add(int index,obj),get(int index),remove(int index)。人们不接受。然后我说基于索引和随机访问是两个不同的概念。我是对的吗?
答案 0 :(得分:8)
所以,这个问题比看起来有点棘手,因为这些术语的适当性确实取决于上下文,正如JB Nizet在下面的评论中强调的那样,这实际上归结为一个术语问题,而不是实现问题或者实际的概念,所以这个答案主要是关于短语的迂腐。首先,您的定义是:
- 基于索引:可以通过传递索引来访问。现在内部它正在进行随机或顺序迭代并不重要。
- 随机访问:您可以随意访问某个位置。
- 顺序访问:从其他某个位置开始依次逐个访问所需位置。
首先照顾这一部分:“基于索引的”并不属于那里。术语“基于索引”并不真正识别访问类型或任何东西,它只是意味着......“基于索引”。它只是一个可以形容某事的任意形容词。在谈论一般访问类型时,我们只讨论随机和顺序。通常,“基于索引的访问”意味着/是“随机访问”的同义词。 如果存在“随机访问”样式界面,可能它使用索引,也许它使用其他东西,谁知道,它并不重要。因此,让我们从那里的术语列表中“基于索引”。
如果这没有多大意义,可以这样想:你的列表“基于索引”,“随机访问”,“顺序访问”,类似于“磁性”,“金属椅子”,“木椅“,分别。第一个只是一个形容词,而不是一种类型的椅子,如果你在谈论椅子,那么它就意味着“金属椅子”而对“木椅”没有意义。
现在,至于LinkedList
,只是以列表的形式表达几个点,而不是特别顺序:
LinkedList
实现List
界面,因此支持随机访问(通过get(int)
和朋友)。LinkedList
支持来自iterator()
界面(Collection
扩展)的顺序访问(来自List
)。List
(无论是LinkedList
,ArrayList
等等。)支持都是随机的和顺序访问。所以说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
个实例支持contains
和remove
的索引访问权限;仅通过iterator
和for-each循环进行检索的顺序访问。
答案 2 :(得分:0)