用hashset的retainall()求交集的核心是将一数组转为hashset后保留与另一集合的共有元素,时间复杂度o(n+m),需确保元素正确实现equals()和hashcode(),基本类型需装箱处理。

用 HashSet 的 retainAll() 实现两个数组交集,核心思路是:把一个数组转为 HashSet,再调用 retainAll() 保留它与另一个集合共有的元素。这个方法简洁高效,平均时间复杂度接近 O(n + m),比双重循环的 O(n×m) 快得多。
前提:确保数组元素可正确比较
retainAll() 依赖元素的 equals() 和 hashCode() 方法。对基本类型数组(如 int[])不能直接使用,需先转为包装类型(如 Integer[])或使用 Stream 处理;对自定义对象,必须重写 equals() 和 hashCode(),否则交集结果可能为空或错误。
标准操作步骤(以 Integer 数组为例)
- 将第一个数组转为
HashSet:Set<integer> set1 = new HashSet(Arrays.asList(arr1));</integer> - 将第二个数组也转为集合(推荐
HashSet,避免重复影响性能):Set<integer> set2 = new HashSet(Arrays.asList(arr2));</integer> - 调用
set1.retainAll(set2)—— 此时set1就只保留两个集合共有的元素 - 如需返回数组,可转回:
Integer[] result = set1.toArray(new Integer[0]);
注意点和常见优化
为提升效率和安全性,建议:
- 总是用较小的集合调用
retainAll(),减少迭代次数 - 如果原始数组含
null,HashSet支持单个null,但Arrays.asList()对null敏感,需手动处理 - 若需保持原始顺序,
retainAll()不保证顺序,后续可用LinkedHashSet或按原数组遍历过滤 - 对基本类型(如
int[]),推荐用IntStream:Set<integer> set = IntStream.of(arr1).boxed().collect(Collectors.toSet());</integer>
简单示例代码
// arr1 = {1, 2, 3, 4}, arr2 = {3, 4, 5, 6}
Set<integer> set = new HashSet(Arrays.asList(1, 2, 3, 4));<br>
set.retainAll(Arrays.asList(3, 4, 5, 6)); // set 变为 {3, 4}</integer>











