我知道ArrayDeque在添加和删除简单列表时速度很快。 我测试了它,添加和删除比链接列表更快。 因为我知道它是作为数组实现的,所以为什么不随机访问呢?
我在Java src中读取了ArrayDeque.java文件。但我的英语水平不太了解它。我看过很多来自Google和Stack Overflow的文章,但我没有得到我想要的答案。
总之,我正在寻找的是:
- 为什么 ArrayDeque 不是随机访问?(我最好奇)
- 在什么情况下使用ArrayDeque?
- 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()