Java HashSet retainAll() 方法
方法概述
retainAll()
是 Java HashSet
类中的一个重要方法,它用于保留集合中与指定集合相同的元素,换句话说就是求两个集合的交集。
方法语法
实例
public boolean retainAll(Collection<?> c)
方法参数
Collection<?> c
:包含要保留元素的集合- 返回值:如果
HashSet
因调用而改变则返回true
,否则返回false
工作原理
基本功能
retainAll()
方法会修改当前 HashSet
,使其仅保留与指定集合 c
中相同的元素。所有不在指定集合 c
中的元素都将从当前 HashSet
中移除。
算法复杂度
这个方法的时间复杂度通常是 O(n),其中 n 是集合的大小,因为它需要检查当前集合中的每个元素是否存在于指定集合中。
使用示例
示例 1:基本用法
实例
import java.util.HashSet;
public class RetainAllExample {
public static void main(String[] args) {
// 创建第一个 HashSet
HashSet<String> set1 = new HashSet<>();
set1.add("Apple");
set1.add("Banana");
set1.add("Orange");
// 创建第二个 HashSet
HashSet<String> set2 = new HashSet<>();
set2.add("Banana");
set2.add("Grape");
// 保留 set1 中与 set2 相同的元素
boolean changed = set1.retainAll(set2);
System.out.println("set1 是否被修改: " + changed); // 输出: true
System.out.println("set1 保留后的内容: " + set1); // 输出: [Banana]
}
}
public class RetainAllExample {
public static void main(String[] args) {
// 创建第一个 HashSet
HashSet<String> set1 = new HashSet<>();
set1.add("Apple");
set1.add("Banana");
set1.add("Orange");
// 创建第二个 HashSet
HashSet<String> set2 = new HashSet<>();
set2.add("Banana");
set2.add("Grape");
// 保留 set1 中与 set2 相同的元素
boolean changed = set1.retainAll(set2);
System.out.println("set1 是否被修改: " + changed); // 输出: true
System.out.println("set1 保留后的内容: " + set1); // 输出: [Banana]
}
}
示例 2:没有共同元素的情况
实例
import java.util.HashSet;
public class NoCommonElements {
public static void main(String[] args) {
HashSet<Integer> numbers1 = new HashSet<>();
numbers1.add(1);
numbers1.add(2);
numbers1.add(3);
HashSet<Integer> numbers2 = new HashSet<>();
numbers2.add(4);
numbers2.add(5);
boolean changed = numbers1.retainAll(numbers2);
System.out.println("集合是否被修改: " + changed); // 输出: true
System.out.println("numbers1 保留后的内容: " + numbers1); // 输出: []
}
}
public class NoCommonElements {
public static void main(String[] args) {
HashSet<Integer> numbers1 = new HashSet<>();
numbers1.add(1);
numbers1.add(2);
numbers1.add(3);
HashSet<Integer> numbers2 = new HashSet<>();
numbers2.add(4);
numbers2.add(5);
boolean changed = numbers1.retainAll(numbers2);
System.out.println("集合是否被修改: " + changed); // 输出: true
System.out.println("numbers1 保留后的内容: " + numbers1); // 输出: []
}
}
注意事项
1. 集合修改
- 如果调用
retainAll()
后集合没有变化(即已经是两个集合的交集),方法将返回false
- 如果指定集合
c
为空,当前集合将被清空
2. 并发修改
如果在迭代集合时调用 retainAll()
方法,可能会抛出 ConcurrentModificationException
。应该在迭代前完成集合修改操作。
3. Null 值处理
- 如果当前集合允许 null 值而参数集合不允许,调用
retainAll()
后 null 值将被移除 - 如果参数集合为 null,将抛出
NullPointerException
实际应用场景
1. 数据过滤
当需要从一个大数据集中筛选出符合特定条件的子集时,可以使用 retainAll()
方法。
2. 权限控制
在权限系统中,可以使用这个方法找出用户拥有的所有权限与某个角色所需权限的交集。
3. 数据分析
在数据分析中,找出两个数据集共有的元素。
与其他方法的比较
方法 | 功能 | 是否修改原集合 | 返回值含义 |
---|---|---|---|
retainAll() |
保留与指定集合相同的元素 | 是 | 集合是否被修改 |
removeAll() |
移除与指定集合相同的元素 | 是 | 集合是否被修改 |
containsAll() |
检查是否包含指定集合所有元素 | 否 | 是否全部包含 |
addAll() |
添加指定集合所有元素 | 是 | 集合是否被修改 |
性能优化建议
- 如果频繁进行集合交集操作,考虑使用专门为集合操作优化的库
- 对于大型集合,可以先将较小的集合转换为
HashSet
以提高查找效率 - 在多线程环境下使用
Collections.synchronizedSet()
包装集合
总结
HashSet
的 retainAll()
方法是一个强大的集合操作工具,可以方便地实现集合交集功能。理解它的工作原理和特性,可以帮助开发者更高效地处理集合数据。在实际开发中,应根据具体需求选择合适的集合操作方法,并注意其性能影响和线程安全性。
点我分享笔记