deque是接口不能直接new,需用arraydeque(推荐)或linkedlist实现;arraydeque非线程安全,底层为循环数组;add/offer、remove/poll、peek系列方法失败策略不同,push/pop仅操作头部。

Deque 接口本身不能直接 new,得用具体实现类
Java 的 Deque 是接口,不能实例化。你写 new Deque() 会编译报错。实际要用 ArrayDeque 或 LinkedList ——前者性能更好、内存更紧凑,后者支持 null 元素但有额外对象开销。
推荐默认用 ArrayDeque,除非你需要在队列中间插入/删除(这时才考虑 LinkedList)。
-
ArrayDeque不是线程安全的,多线程要加锁或换ConcurrentLinkedDeque -
ArrayDeque底层是循环数组,扩容时复制整个数组,频繁扩容影响性能 - 别用
Stack类,它继承自过时的Vector,且push/pop方法不是双端语义的首选
插入操作:addFirst/addLast 与 offerFirst/offerLast 的区别
addFirst() 和 addLast() 在容量满(对 ArrayDeque 实际不会满,但某些实现可能受限)或空指针时抛 IllegalStateException 或 NullPointerException;而 offerFirst() 和 offerLast() 失败时返回 false,更适配“尽力而为”场景。
日常使用建议统一走 offerXxx 系列,避免意外异常中断流程。
-
offerFirst("a")→ 插到头部,成功返回true -
offerLast("b")→ 插到尾部,成功返回true -
addFirst(null)→ 抛NullPointerException(ArrayDeque不允许 null) -
offerFirst(null)→ 直接返回false,不抛异常
弹出操作:removeFirst/removeLast 与 pollFirst/pollLast 的容错差异
空队列调用 removeFirst() 或 removeLast() 会抛 NoSuchElementException;而 pollFirst() 和 pollLast() 返回 null(引用类型)或默认值(基本类型包装类),更适合判空后处理。
如果你的逻辑里队列可能为空,别用 removeXxx,否则容易线上抛异常。
Deque<string> dq = new ArrayDeque();</string>-
dq.pollFirst()→ 返回null,安全 -
dq.removeFirst()→ 抛NoSuchElementException - 想取但不移除?用
peekFirst()/peekLast(),空时也返回null
用法混淆点:pop() 和 push() 其实只是 addFirst / removeFirst 的别名
push() 就是 addFirst(),pop() 就是 removeFirst() —— 它们只操作头端,和栈行为一致,**不是**从尾端操作。这点容易误解,尤其当命名看起来像“压入/弹出任意端”时。
如果你看到别人用 push/pop 做双端操作,大概率逻辑错了。
-
dq.push("x")≡dq.addFirst("x") -
dq.pop()≡dq.removeFirst() - 没有
unshift()或shift()这样的方法,别套 JS 习惯 - 真要模拟“队首进、队尾出”,就用
addFirst()+pollLast()
remove 和 poll 的失败策略,或者误以为 push 能往尾插。










