如何在ArrayList<int[]>中查找特定int[]元素?contains方法失效问题
解决ArrayList<int[]>中contains方法失效的高效方案
问题核心:ArrayList的contains方法依赖元素的equals实现,而int[]作为数组,它的equals是比较引用地址而非数组内容,所以即使两个数组元素完全一致,只要不是同一个对象,contains就会返回false。
下面给几个高效的解决思路,避免超时问题:
1. 直接遍历+Arrays.equals比较(适合单次/少量查找)
不需要额外存储,直接遍历ArrayList,用Arrays.equals逐个比较数组内容。这个方法的优势是没有额外的预处理开销,找到匹配项就可以立即终止遍历,在很多场景下比预存哈希更高效。
import java.util.ArrayList; import java.util.Arrays; public class Main { public static void main(String[] args) { ArrayList<int[]> arrList = new ArrayList<>(); arrList.add(new int[]{1, 2, 3}); arrList.add(new int[]{4, 5, 6}); int[] target = {1, 2, 3}; boolean isExist = false; for (int[] arr : arrList) { if (Arrays.equals(arr, target)) { isExist = true; break; // 找到就停止,减少遍历次数 } } System.out.println(isExist); // 输出true } }
2. 自定义包装类+HashSet(适合频繁查找)
如果需要多次执行查找操作,用HashSet配合自定义包装类可以把查找复杂度降到O(1)。包装类需要重写equals和hashCode方法,基于数组内容实现:
import java.util.Arrays; import java.util.HashSet; class IntArrayWrapper { private final int[] array; public IntArrayWrapper(int[] array) { this.array = array.clone(); // 克隆数组,防止外部修改影响哈希和比较 } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; IntArrayWrapper that = (IntArrayWrapper) o; return Arrays.equals(array, that.array); } @Override public int hashCode() { return Arrays.hashCode(array); // 基于数组内容生成哈希值 } } public class Main { public static void main(String[] args) { HashSet<IntArrayWrapper> set = new HashSet<>(); set.add(new IntArrayWrapper(new int[]{1, 2, 3})); set.add(new IntArrayWrapper(new int[]{4, 5, 6})); int[] target = {1, 2, 3}; boolean isExist = set.contains(new IntArrayWrapper(target)); System.out.println(isExist); // 输出true } }
为什么预存哈希的方法会超时?
你之前把每个数组转哈希存到另一个ArrayList的思路,不仅需要额外的空间存储哈希值,还要处理哈希碰撞(哈希值相同但数组内容不同的情况),这意味着找到相同哈希后还要再去原列表比对数组内容,相当于多了一层遍历。而且预处理阶段要给所有数组计算哈希,本身就会消耗时间,不如直接遍历比对高效。
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

