ZetCode

Java Collections.disjoint 方法

上次修改时间:2025 年 4 月 20 日

Collections.disjoint 方法是 Java 集合框架中的一个实用方法。它检查两个指定的集合是否没有任何共同的元素。这个方法对于确定集合是否互斥很有用。

如果集合没有任何共同元素,则该方法返回 true。如果它们共享至少一个元素,则返回 false。该方法针对不同的集合类型进行了性能优化。

Collections.disjoint 方法概述

disjoint 方法是 java.util.Collections 类中的一个静态方法。它接受两个集合作为参数,并返回一个布尔值。方法签名是:public static boolean disjoint(Collection<?> c1, Collection<?> c2)

该方法适用于任何 Collection 实现。它正确处理空值,并且对并发访问是线程安全的。时间复杂度取决于提供的集合类型。

使用 List 的基本 disjoint 示例

此示例演示了 Collections.disjoint 与两个 ArrayList 的基本用法。我们创建两个字符串列表,并检查它们是否具有任何共同的元素。

DisjointBasicExample.java
package com.zetcode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class DisjointBasicExample {

    public static void main(String[] args) {
        
        List<String> list1 = new ArrayList<>();
        list1.add("Apple");
        list1.add("Banana");
        list1.add("Cherry");
        
        List<String> list2 = new ArrayList<>();
        list2.add("Orange");
        list2.add("Lemon");
        list2.add("Lime");
        
        boolean areDisjoint = Collections.disjoint(list1, list2);
        System.out.println("Are lists disjoint? " + areDisjoint);
        
        list2.add("Apple");
        areDisjoint = Collections.disjoint(list1, list2);
        System.out.println("After adding Apple: " + areDisjoint);
    }
}

在此示例中,我们首先检查两个列表,它们没有任何共同的元素。该方法返回 true。然后我们向第二个列表添加 "Apple",然后再次检查。现在该方法返回 false,因为两个列表都包含 "Apple"。

输出显示了该方法如何正确地识别集合何时共享元素。这对于基于集合内容的验证或条件逻辑很有用。

使用 Set 的 disjoint

此示例展示了 Collections.disjoint 如何与 Set 实现一起使用。Set 是无序集合,不允许重复。我们将在本演示中使用 HashSet 和 TreeSet。

DisjointWithSets.java
package com.zetcode;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class DisjointWithSets {

    public static void main(String[] args) {
        
        Set<Integer> set1 = new HashSet<>();
        set1.add(1);
        set1.add(2);
        set1.add(3);
        
        Set<Integer> set2 = new TreeSet<>();
        set2.add(4);
        set2.add(5);
        set2.add(6);
        
        System.out.println("Disjoint initially: " + 
            Collections.disjoint(set1, set2));
            
        set2.add(3);
        System.out.println("After adding 3: " + 
            Collections.disjoint(set1, set2));
    }
}

此示例演示了 disjoint 与不同的 Set 实现。最初,这些集合没有任何共同的元素,因此该方法返回 true。在向第二个集合添加元素 3(它已经存在于第一个集合中)之后,该方法返回 false

该示例显示了 disjoint 在不同的 Collection 实现中如何保持一致。该方法不依赖于集合的顺序或实现细节。

使用混合集合类型的 disjoint

Collections.disjoint 方法可以同时处理不同的集合类型。此示例演示了检查 List 和 Set 之间的不相交性。

DisjointMixedTypes.java
package com.zetcode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class DisjointMixedTypes {

    public static void main(String[] args) {
        
        List<String> list = new ArrayList<>();
        list.add("Red");
        list.add("Green");
        list.add("Blue");
        
        Set<String> set = new HashSet<>();
        set.add("Cyan");
        set.add("Magenta");
        set.add("Yellow");
        
        System.out.println("Disjoint initially: " + 
            Collections.disjoint(list, set));
            
        set.add("Green");
        System.out.println("After adding Green: " + 
            Collections.disjoint(list, set));
    }
}

此示例显示了 Collections.disjoint 如何在不同的集合类型之间无缝工作。我们首先检查一个 List 和一个 Set,它们没有任何共同的元素,这返回 true。在将 "Green" 添加到 Set 中,该元素存在于 List 中后,该方法返回 false

该方法跨不同集合类型工作的能力使其用途广泛。您可以使用它来比较 List、Set、Queue 等的任何组合,而不必担心它们的特定实现。

使用空集合的 disjoint

此示例探讨了 Collections.disjoint 如何处理空集合。我们将测试空集合和非空集合的各种组合,以了解边缘情况。

DisjointEmptyCollections.java
package com.zetcode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class DisjointEmptyCollections {

    public static void main(String[] args) {
        
        List<String> emptyList1 = new ArrayList<>();
        List<String> emptyList2 = new ArrayList<>();
        List<String> nonEmptyList = new ArrayList<>();
        nonEmptyList.add("Item");
        
        System.out.println("Two empty lists: " + 
            Collections.disjoint(emptyList1, emptyList2));
            
        System.out.println("Empty and non-empty: " + 
            Collections.disjoint(emptyList1, nonEmptyList));
            
        System.out.println("Non-empty and empty: " + 
            Collections.disjoint(nonEmptyList, emptyList1));
    }
}

当两个集合都为空时,disjoint 返回 true,因为它们不共享任何元素。当将一个空集合与一个非空集合进行比较时,出于同样的原因,它也返回 true

这些结果表明了该方法的逻辑一致性。空集合始终与任何其他集合(包括其他空集合)不相交。

使用 Null 值的 disjoint

此示例检查 Collections.disjoint 如何处理集合中的空值。我们将测试一个或两个集合包含 null 的情况,以及集合本身为 null 的情况。

DisjointNullValues.java
package com.zetcode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class DisjointNullValues {

    public static void main(String[] args) {
        
        List<String> listWithNull = new ArrayList<>();
        listWithNull.add("A");
        listWithNull.add(null);
        listWithNull.add("B");
        
        List<String> listWithoutNull = new ArrayList<>();
        listWithoutNull.add("C");
        listWithoutNull.add("D");
        
        System.out.println("List with null vs without: " + 
            Collections.disjoint(listWithNull, listWithoutNull));
            
        List<String> anotherListWithNull = new ArrayList<>();
        anotherListWithNull.add(null);
        anotherListWithNull.add("E");
        
        System.out.println("Two lists with null: " + 
            Collections.disjoint(listWithNull, anotherListWithNull));
            
        try {
            Collections.disjoint(null, listWithoutNull);
        } catch (NullPointerException e) {
            System.out.println("Null collection error: " + e.getMessage());
        }
    }
}

当一个集合包含 null 而另一个集合不包含 null 时,disjoint 正常工作。当两个集合都包含 null 时,该方法返回 false,因为 null 被视为一个共同元素。

将 null 作为集合参数传递会导致 NullPointerException。该方法要求两个参数都是非 null 的集合实例。

来源

Java Collections.disjoint 文档

在本文中,我们深入探讨了 Java Collections.disjoint 方法。

作者

我叫 Jan Bodnar,是一位经验丰富的程序员,在这个领域拥有多年的经验。我于 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和 8 本电子书。凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程