Java中如何判断两个ArrayDeque是否相等?
ArrayDeque内容相等判断及代码优化
关于equals()方法的说明
ArrayDeque没有重写equals()和hashCode()方法,它使用Object类的默认实现——仅比较对象的内存地址,所以无法用来判断两个ArrayDeque的元素是否完全相等。而Stack类继承自Vector,Vector重写了equals方法,会逐个比较元素内容,因此可以直接用equals()判断内容相等。
你的代码优化方案
你当前的代码会移除原队列中的所有元素,这在LeetCode题目这类场景中不可取(后续可能还需要使用原队列),以下是几种优化方案:
方案1:迭代器遍历比较
利用ArrayDeque的迭代器逐个对比元素,完全不修改原队列:
import java.util.Objects; import java.util.Iterator; import java.util.ArrayDeque; public boolean isEqual(ArrayDeque<Character> sQueue, ArrayDeque<Character> tQueue) { if (sQueue.size() != tQueue.size()) { return false; } Iterator<Character> sIter = sQueue.iterator(); Iterator<Character> tIter = tQueue.iterator(); while (sIter.hasNext()) { // 用Objects.equals避免空指针,同时正确比较Character包装类 if (!Objects.equals(sIter.next(), tIter.next())) { return false; } } return true; }
方案2:复制队列副本操作
如果习惯用removeLast的逻辑,可以复制原队列的副本,操作副本不影响原队列:
import java.util.Objects; import java.util.ArrayDeque; public boolean isEqual(ArrayDeque<Character> sQueue, ArrayDeque<Character> tQueue) { if (sQueue.size() != tQueue.size()) { return false; } // 复制原队列到新实例 ArrayDeque<Character> sCopy = new ArrayDeque<>(sQueue); ArrayDeque<Character> tCopy = new ArrayDeque<>(tQueue); while (!sCopy.isEmpty()) { if (!Objects.equals(sCopy.removeLast(), tCopy.removeLast())) { return false; } } return true; }
方案3:转数组后比较
将ArrayDeque转为数组,利用Arrays.equals()直接对比:
import java.util.Arrays; import java.util.ArrayDeque; public boolean isEqual(ArrayDeque<Character> sQueue, ArrayDeque<Character> tQueue) { if (sQueue.size() != tQueue.size()) { return false; } return Arrays.equals(sQueue.toArray(), tQueue.toArray()); }
针对LeetCode《Backspace String Compare》的提示
在这道题中,你可以先分别处理两个字符串得到对应的ArrayDeque,再用上述任意一种方法比较队列内容即可,无需修改原队列元素。
内容的提问来源于stack exchange,提问作者mattsmith5
相关产品推荐
相关产品推荐

