You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中不依赖java.util.*实现ArrayDeque的deepEquals方法问题解决

ArrayDeque深度相等判断适配LinkedListArrayDeque的解决方案(无java.util.*依赖)

问题背景

我在实现自定义ArrayDeque时遇到了问题:原本的deepEquals方法无法同时适配LinkedListArrayDeque,而且要求不能使用java.util.*包下的工具类。初始代码里普通的equals方法能通过测试,但deepEquals完全失效。

解决思路

经过排查后发现,根本不需要单独实现deepEquals方法,只需要对现有的equals方法进行优化,就能让它具备深度相等的判断能力。

优化后的代码

// 自定义ArrayDeque类的equals方法,适配LinkedListArrayDeque且无java.util.*依赖
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    // 此处Deque为自定义接口,而非java.util.Deque
    if (!(o instanceof Deque)) return false;
    Deque<?> other = (Deque<?>) o;
    if (size() != other.size()) return false;

    Iterator<?> it1 = iterator();
    Iterator<?> it2 = other.iterator();
    while (it1.hasNext() && it2.hasNext()) {
        Object elem1 = it1.next();
        Object elem2 = it2.next();
        if (!isDeepEqual(elem1, elem2)) {
            return false;
        }
    }
    return !it1.hasNext() && !it2.hasNext();
}

// 辅助方法:实现元素的深度相等判断
private boolean isDeepEqual(Object elem1, Object elem2) {
    if (elem1 == elem2) return true;
    if (elem1 == null || elem2 == null) return false;
    
    // 处理数组类型的深度比较
    if (elem1.getClass().isArray() && elem2.getClass().isArray()) {
        return arrayDeepEquals(elem1, elem2);
    }
    
    // 非数组元素调用自身equals,支持嵌套对象的深度判断
    return elem1.equals(elem2);
}

// 辅助方法:处理不同类型数组的深度相等
private boolean arrayDeepEquals(Object arr1, Object arr2) {
    // 对象数组
    if (arr1 instanceof Object[] && arr2 instanceof Object[]) {
        Object[] objArr1 = (Object[]) arr1;
        Object[] objArr2 = (Object[]) arr2;
        if (objArr1.length != objArr2.length) return false;
        for (int i = 0; i < objArr1.length; i++) {
            if (!isDeepEqual(objArr1[i], objArr2[i])) {
                return false;
            }
        }
        return true;
    }
    // int数组(可按需扩展long、boolean等其他基本类型数组)
    else if (arr1 instanceof int[] && arr2 instanceof int[]) {
        int[] intArr1 = (int[]) arr1;
        int[] intArr2 = (int[]) arr2;
        if (intArr1.length != intArr2.length) return false;
        for (int i = 0; i < intArr1.length; i++) {
            if (intArr1[i] != intArr2[i]) return false;
        }
        return true;
    }
    // 其他未覆盖的数组类型,直接调用equals
    else {
        return arr1.equals(arr2);
    }
}

说明

优化后的equals方法通过以下逻辑实现深度相等判断:

  • 优先判断引用相等或null的边界情况
  • 遇到数组元素时,调用自定义的数组深度比较方法,支持对象数组和基本类型数组的递归判断
  • 非数组元素直接调用自身equals方法,自然支持嵌套对象的深度校验

这种方式既省去了单独维护deepEquals方法的麻烦,也能同时适配ArrayDeque和LinkedListArrayDeque,且完全不依赖java.util.*包。

内容的提问来源于stack exchange,提问作者zixuan zhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:25:23