ZetCode

Java Collections.emptySet 方法

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

Collections.emptySet 方法返回一个不可变的空集合。它是 Java Collections 工具类的一部分。此方法提供了一种类型安全的方式来获取空集合实例。

返回的集合是可序列化的,并且实现了 Set 接口。它是不可变的,这意味着任何修改尝试都会抛出异常。这使其具有线程安全性和内存效率。

Collections.emptySet 概述

Collections.emptySet 返回一个单例的空 Set 实例。它在 Java 1.5 中作为 Collections Framework 的一部分引入。该方法是泛型的,并返回指定类型的 Set。

主要优点是内存效率。由于集合是空的且不可变的,因此可以重用相同的实例。 这避免了不必要的对象创建。它非常适合需要返回空集合的方法。

emptySet 的基本用法

此示例演示了 Collections.emptySet 的最基本用法。我们获取一个空集合并验证其属性。该示例通过尝试修改它来显示集合的不可变性。

EmptySetBasic.java
package com.zetcode;

import java.util.Collections;
import java.util.Set;

public class EmptySetBasic {

    public static void main(String[] args) {
        
        Set<String> emptySet = Collections.emptySet();
        
        System.out.println("Set size: " + emptySet.size());
        System.out.println("Is empty: " + emptySet.isEmpty());
        
        try {
            emptySet.add("Attempt to add");
        } catch (UnsupportedOperationException e) {
            System.out.println("Expected exception: " + e.getMessage());
        }
    }
}

此代码展示了如何使用 Collections.emptySet 获取空集合。我们通过检查其大小和 isEmpty 状态来验证集合是否为空。 添加元素的尝试会抛出 UnsupportedOperationException。

输出演示了集合的不可变性。此行为与 Java Collections Framework 中所有不可变集合实现一致。

从方法返回 emptySet

emptySet 的常见用例是从方法返回空结果。 此示例显示了一个有条件地返回空集合的方法。它是返回 null 的更简洁的替代方法。

EmptySetReturn.java
package com.zetcode;

import java.util.Collections;
import java.util.Set;

public class EmptySetReturn {

    public static Set<String> getFilteredItems(boolean condition) {
        if (!condition) {
            return Collections.emptySet();
        }
        
        // In a real scenario, return populated set
        return Set.of("Item1", "Item2");
    }
    
    public static void main(String[] args) {
        Set<String> items = getFilteredItems(false);
        
        System.out.println("Returned set: " + items);
        System.out.println("Size: " + items.size());
    }
}

此示例演示了使用 emptySet 作为方法返回值。 当不满足条件时,该方法返回一个空集合。 这比返回 null 更好,因为它避免了 NullPointerException

调用者可以安全地使用返回的集合而无需进行 null 检查。 所有集合操作都将在空集合上按预期工作。 这种模式在 Java API 中广泛使用。

Collections 操作中的 emptySet

emptySet 可用于各种集合操作。 此示例展示了如何将其与 addAllcontainsAll 等方法一起使用。 空集合在这些操作中表现出可预测的行为。

EmptySetOperations.java
package com.zetcode;

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

public class EmptySetOperations {

    public static void main(String[] args) {
        
        Set<String> colors = new HashSet<>();
        colors.add("Red");
        colors.add("Green");
        
        Set<String> emptySet = Collections.emptySet();
        
        // AddAll with empty set
        boolean changed = colors.addAll(emptySet);
        System.out.println("After addAll: " + colors);
        System.out.println("Was modified? " + changed);
        
        // ContainsAll with empty set
        boolean containsAll = colors.containsAll(emptySet);
        System.out.println("Contains all empty? " + containsAll);
        
        // RemoveAll with empty set
        changed = colors.removeAll(emptySet);
        System.out.println("After removeAll: " + colors);
        System.out.println("Was modified? " + changed);
    }
}

此示例展示了空集合如何与集合操作交互。 将空集合添加到另一个集合没有任何影响。 任何集合都包含空集合的所有元素。 删除空集合也没有任何影响。

输出演示了这些行为。 空集合充当许多集合运算的标识元素。 这使其在算法和条件逻辑中很有用。

类型安全的 emptySet 用法

emptySet 的泛型特性确保了类型安全。 此示例演示了将其与不同类型一起使用。 编译器强制执行类型约束,防止 ClassCastException。

EmptySetTypes.java
package com.zetcode;

import java.util.Collections;
import java.util.Set;

public class EmptySetTypes {

    public static void main(String[] args) {
        
        Set<String> stringSet = Collections.emptySet();
        Set<Integer> intSet = Collections.emptySet();
        Set<Object> objectSet = Collections.emptySet();
        
        // All are truly empty
        System.out.println("String set size: " + stringSet.size());
        System.out.println("Integer set size: " + intSet.size());
        System.out.println("Object set size: " + objectSet.size());
        
        // Type safety demonstrated
        // stringSet.add(123); // Compile error
        // intSet.add("text"); // Compile error
    }
}

此示例显示了 emptySet 的类型安全用法。 我们创建了不同类型的空集合。 编译器阻止添加错误类型的元素,从而证明了类型安全。

所有集合都真正为空,无论其泛型类型如何。 类型参数仅影响编译时检查。 在运行时,它们都引用相同的不可变空集合实例。

方法参数中的 emptySet

emptySet 可用于将空集合传递给方法。 此示例显示了一个处理集合的方法以及如何使用空集合调用它。 这比传递 null 更简洁。

EmptySetParameter.java
package com.zetcode;

import java.util.Collections;
import java.util.Set;

public class EmptySetParameter {

    public static void processSet(Set<String> items) {
        System.out.println("Processing set with " + items.size() + " items");
        
        for (String item : items) {
            System.out.println("Processing: " + item);
        }
    }
    
    public static void main(String[] args) {
        // Passing empty set to method
        processSet(Collections.emptySet());
        
        // Compare with null
        try {
            processSet(null);
        } catch (NullPointerException e) {
            System.out.println("Null caused: " + e);
        }
    }
}

此示例演示了将空集合传递给方法。 该方法使用空集合正确地工作,迭代零次。 相比之下,传递 null 会导致 NullPointerException。

使用 emptySet 使 API 更加健壮。 当使用空集合代替时,方法不需要 null 检查。 这导致更干净、更可靠的代码。

emptySet 与 new HashSet

此示例比较了 emptySet 与创建新的空 HashSet。 它演示了使用不可变空集合的内存和性能优势。

EmptySetVsHashSet.java
package com.zetcode;

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

public class EmptySetVsHashSet {

    public static void main(String[] args) {
        
        Set<String> emptySet1 = Collections.emptySet();
        Set<String> emptySet2 = Collections.emptySet();
        
        Set<String> hashSet1 = new HashSet<>();
        Set<String> hashSet2 = new HashSet<>();
        
        // Same instance check
        System.out.println("emptySet1 == emptySet2: " + 
            (emptySet1 == emptySet2));
        System.out.println("hashSet1 == hashSet2: " + 
            (hashSet1 == hashSet2));
        
        // Memory comparison
        System.out.println("emptySet1 size estimate: " + 
            estimateSize(emptySet1));
        System.out.println("hashSet1 size estimate: " + 
            estimateSize(hashSet1));
    }
    
    private static int estimateSize(Set<?> set) {
        // Simplified size estimation
        return set instanceof HashSet ? 16 : 0;
    }
}

此示例将不可变空集合与新创建的 HashSet 进行比较。 空集合是一个单例,因此所有对 emptySet 的调用都返回相同的实例。 新的 HashSet 是不同的对象。

输出显示了内存优势。 空集合不使用额外的内存来存储元素。 HashSet 即使为空,也会为其内部结构分配内存。

流操作中的 emptySet

emptySet 与 Java Streams 配合良好。 此示例展示了如何将其用作流操作中的默认值。 当没有元素时,它提供了一个安全、不可变的结果。

EmptySetStreams.java
package com.zetcode;

import java.util.Collections;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class EmptySetStreams {

    public static void main(String[] args) {
        
        // Stream with elements
        Set<String> colors = Stream.of("Red", "Green", "Blue")
            .filter(s -> s.startsWith("B"))
            .collect(Collectors.toSet());
        System.out.println("Colors starting with B: " + colors);
        
        // Empty stream case
        Set<String> empty = Stream.<String>empty()
            .collect(Collectors.toSet());
        System.out.println("Collected empty stream: " + empty);
        
        // Using emptySet as default
        Set<String> safeResult = colors.isEmpty() ? 
            Collections.emptySet() : colors;
        System.out.println("Safe result: " + safeResult);
    }
}

此示例演示了流处理中的 emptySet。 我们将流结果收集到集合中并处理空情况。 空集合充当一个安全的默认值。

输出显示了当没有元素匹配时,流如何自然地生成空集合。 在某些情况下,显式使用 emptySet 可以使代码的意图更清晰。

来源

Java Collections.emptySet 文档

在本文中,我们深入探讨了 Collections.emptySet。 我们介绍了基本用法、方法返回、集合操作、类型安全和流集成。 空集合是 Java 中一个简单但功能强大的工具。

作者

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

列出所有Java教程