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

