ArrayDeque是作为一个数组实现的,为什么它不是随机访问?



我知道ArrayDeque在添加和删除简单列表时速度很快。 我测试了它,添加和删除比链接列表更快。 因为我知道它是作为数组实现的,所以为什么不随机访问呢?

我在Java src中读取了ArrayDeque.java文件。但我的英语水平不太了解它。我看过很多来自Google和Stack Overflow的文章,但我没有得到我想要的答案。

总之,我正在寻找的是:

  1. 为什么 ArrayDeque 不是随机访问?(我最好奇)
  2. 在什么情况下使用ArrayDeque?
  3. ArrayDeque 不是作为数组实现的吗?(我误解了这一点吗?

非常感谢您的回复!

答案是没有充分的理由。 很容易添加一个常量时间get(int)set(int,E)ArrayDeque。 不止一次,我不得不在ArrayList内实现ArrayDeque算法来弥补这一不足。

如前所述,ArrayDeque 是 Deque 接口的可调整大小数组实现。下划线数据结构是数组。但是,它不支持随机访问,因为它公开了双端队列接口。如果要访问 Deque 的随机元素,可以调用toArray()然后按索引访问元素。

我认为对"为什么没有随机访问">的简短回答是,创建类时似乎没有必要,而且它也没有意义:ArrayDeque首先是一种Deque,它主要允许两端访问,仅此而已。所以我有点同意随机访问函数不应该在Deque中(尽管按照同样的逻辑,它也不应该在List中)。你也可以让ArrayDeque实现List,正如其他人指出的那样,但它很难改造,也许还有其他问题。我个人认为 Java 中的集合接口是一团糟,但我会把它留在这里。

现在,如果您想解决ArrayDeque没有随机访问的缺点,有一些选择:

  • 首先,你真的需要随机访问吗?也许iterator()descendingIterator()就足够好了。
  • 对于真正的随机访问,这可能不是很快,但它应该是 O(1):deque.stream().skip(index).findFirst().get()

最新更新