collections.disjoint用于判断两个集合是否无交集,返回true表示不相交;它自动选择小集合遍历,时间复杂度约o(min(m,n)),要求元素正确实现equals()和hashcode(),空集合结果恒为true。

Collections.disjoint 是 Java 集合工具类中一个简洁高效的方法,专门用来判断两个集合是否完全不相交(即交集为空)。它返回 true 表示两个集合没有共同元素,false 表示至少有一个公共元素。
基本用法和参数要求
方法签名如下:
public static boolean disjoint(Collection> c1, Collection> c2)
- 接受任意两个
Collection类型对象(如ArrayList、HashSet、LinkedList等) - 内部会自动选择更小的集合进行遍历,以提升性能(时间复杂度接近 O(min(m,n)))
- 允许传入
null集合 —— 但会抛出NullPointerException,所以调用前建议判空
典型使用示例
比如判断用户权限列表和禁用功能列表是否无重叠:
List<string> userRoles = Arrays.asList("admin", "editor");
Set<string> bannedFeatures = new HashSet(Arrays.asList("delete", "publish"));
boolean noOverlap = Collections.disjoint(userRoles, bannedFeatures); // true</string></string>
再比如两个数字集合有交集时返回 false:
Set<integer> setA = Set.of(1, 2, 3); Set<integer> setB = Set.of(3, 4, 5); boolean isDisjoint = Collections.disjoint(setA, setB); // false,因为 3 是共同元素</integer></integer>
注意事项和常见陷阱
-
元素比较依赖 equals() 方法:确保集合中元素正确重写了
equals()和hashCode()(尤其自定义对象) - 不修改原集合:该方法是只读操作,不会对传入的集合做任何变更
-
空集合视为“无交集”:任一集合为空(
size()==0),结果恒为true -
避免重复计算:如果后续还需获取交集内容,不要先调用
disjoint再手动求交,可直接用retainAll或流式处理
替代写法对比(不推荐但需了解)
手动实现等价逻辑虽可行,但易出错且效率低:
// ❌ 不推荐:遍历嵌套、未优化、易忽略 null/empty
boolean manualDisjoint = true;
for (Object o : c1) {
if (c2.contains(o)) {
manualDisjoint = false;
break;
}
}
Collections.disjoint 已做了边界处理、大小优化和短路判断,直接使用更安全可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











