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
相关产品推荐
相关产品推荐

