求解答,Java的ArrayDeque为什么不支持get方法。

新手上路,请多包涵

最近在看Java集合框架的代码,发现ArrayDeque没有get方法。是Java官方认为不需要该方法,还是无法支持?

public E get(int i) {
    if (i > elements.length || i < 0) {
        throw new IndexOutOfBoundsException();
    }
    i = (head + i) % elements.length;
    return (E) elements[i];
}

如果使用上述代码来获取ArrayDeque索引位置的元素,是否可行?

阅读 3.2k
3 个回答

都用队列了不就不应该关心位置么 😂 顶多知道首(head)和尾(tail)就好了。

非想通过索引来取值你不应该用 ArrayList 啥的么。

你会发现还有一点不同的是队列没法从中间插入元素……

其实大部分语言的队列这种数据结构都不支持这么做,倒不是说不能实现,但你这么做了以后队列和列表的区别又在哪儿呢?

Deque毕竟不是List
本身就是作为队列设计的,如果当一个普通List用,在一些场景(比如并不支持的在中间插入)的性能不如普通List

底层无非两种基本结构,链表和数组。链表强在增删,数组强在索引。链表结构需要为每一个存储对象创建node节点,占用内存,除此之外不需要考虑扩展成本。数组在每次扩展的时候复制为自己的两倍,在一一转移,实现成本均摊,两种都需要付出代价。而队列的语义便是先进先出,索引和增删都是不需要的。ArrayDeque,从名字也可以看出来是倾向于 数组了。其实抛开结构优势,也就是数组的索引,链表的增删。依然 数组这种静态数据有优势。deque 也有链表结构的,LinkedList属于 queue的链表实现。

推荐问题