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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:37:20