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

Java中如何避免Set存储重复数组 重写equals方法相关问题

问题原因

Java中HashSet的去重逻辑依赖元素的hashCode()和equals()方法,而int[]数组作为引用类型,这两个方法都继承自Object类,默认仅对比对象的内存地址,不会对比数组的实际内容。你示例代码中两次new出来的int[]{1,2}是不同的内存对象,所以会被HashSet识别为不同元素。

解决方案

方案1:使用List<Integer>替代int数组(推荐)

java.util.List的实现类已经重写了hashCode()和equals()方法,会自动对比集合内的元素内容,直接存入HashSet即可实现内容去重:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        Set<List<Integer>> set = new HashSet<>();
        int[] tmp = new int[]{1,2};
        set.add(Arrays.stream(tmp).boxed().collect(Collectors.toList()));
        tmp = new int[]{1,2};
        set.add(Arrays.stream(tmp).boxed().collect(Collectors.toList()));
        System.out.println(set.size()); // 输出结果为1
    }
}

方案2:自定义int数组包装类

如果必须保留int[]类型的存储,可以自己封装一个数组包装类,重写对应的方法基于数组内容计算哈希值和判等:

import java.util.Arrays;

class IntArrayHolder {
    private final int[] array;

    public IntArrayHolder(int[] array) {
        this.array = array.clone(); // 拷贝数组避免外部修改影响Set内的元素一致性
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        IntArrayHolder that = (IntArrayHolder) o;
        return Arrays.equals(array, that.array);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(array);
    }
}

使用方式如下:

Set<IntArrayHolder> set = new HashSet<>();
set.add(new IntArrayHolder(new int[]{1,2}));
set.add(new IntArrayHolder(new int[]{1,2}));
System.out.println(set.size()); // 输出结果为1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:54:05