ZetCode

Java Collections.emptyList 方法

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

Collections.emptyList 方法返回一个不可变的空列表。 这是一个单例实例,当你需要一个空列表时,可以节省内存。 自 Java 1.5 以来,它一直是 Java 的 Collections 实用程序类的一部分。

空列表用作返回值、默认值或占位符非常有用。 返回的列表是类型安全的,可序列化的。 它不能被修改,在尝试修改时会抛出 UnsupportedOperationException

Collections.emptyList 概述

Collections.emptyList 提供一个共享的不可变空列表实例。 它比创建新的空 ArrayList 实例更有效。 该方法是通用的,并返回一个类型正确的 List<T>

返回的列表实现了所有可选的 List 操作。 但是,所有修改器方法都会抛出 UnsupportedOperationException。 由于它在创建后无法修改,因此是线程安全的。

emptyList 基本用法

此示例演示了 emptyList 的最基本用法。 我们获取一个空列表并验证其属性。 该列表确实是空的并且是不可变的。

EmptyListBasic.java
package com.zetcode;

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

public class EmptyListBasic {

    public static void main(String[] args) {
        
        // Get empty list
        List<String> empty = Collections.emptyList();
        
        // Verify properties
        System.out.println("Size: " + empty.size());
        System.out.println("Is empty: " + empty.isEmpty());
        
        try {
            // Attempt modification
            empty.add("Item");
        } catch (UnsupportedOperationException e) {
            System.out.println("Expected exception: " + e.getMessage());
        }
    }
}

此代码显示了 emptyList 的基本特征。 我们验证该列表为空并且无法修改。 尝试添加项目会按预期抛出异常。

当你需要一个不可变的空列表时,使用 emptyList 优于 new ArrayList。 它更节省内存,并清楚地传达了不可变性。

从方法返回 emptyList

emptyList 的一个常见用例是作为方法返回值。 此示例显示了一个方法,该方法在未找到结果时返回一个空列表。 这避免了返回 null,并遵循了更好的 API 设计实践。

EmptyListReturn.java
package com.zetcode;

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

public class EmptyListReturn {

    public static List<String> findItems(String query) {
        // Simulate no results found
        if (query.isEmpty()) {
            return Collections.emptyList();
        }
        
        // In real code, return actual results
        return List.of("Result1", "Result2");
    }
    
    public static void main(String[] args) {
        List<String> results = findItems("");
        
        System.out.println("Results size: " + results.size());
        System.out.println("Results: " + results);
        
        // Safe to iterate (won't throw NPE)
        for (String item : results) {
            System.out.println(item);
        }
    }
}

此示例演示了使用 emptyList 作为方法返回值。 当没有结果与查询匹配时,该方法返回一个空列表。 这比返回 null 更好,因为它防止了 NullPointerException。

客户端可以安全地在返回的列表上调用方法,而无需进行空检查。 代码更清晰,更不容易出错。 这种模式广泛用于 Java 库和框架。

emptyList 作为默认值

emptyList 可以用作列表字段或变量的默认值。 此示例显示了使用它来初始化一个字段,该字段可能为空。 该字段始终保证是一个有效的 List 实例。

EmptyListDefault.java
package com.zetcode;

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

public class EmptyListDefault {

    private List<String> items = Collections.emptyList();
    
    public void setItems(List<String> newItems) {
        this.items = newItems != null ? newItems : Collections.emptyList();
    }
    
    public List<String> getItems() {
        return items;
    }
    
    public static void main(String[] args) {
        EmptyListDefault example = new EmptyListDefault();
        
        // Default empty list
        System.out.println("Initial items: " + example.getItems());
        
        // Set to null - becomes empty list
        example.setItems(null);
        System.out.println("After null set: " + example.getItems());
        
        // Set to actual list
        example.setItems(List.of("A", "B", "C"));
        System.out.println("After real set: " + example.getItems());
    }
}

此代码显示了使用 emptyList 作为默认值。 该字段从空列表开始,并将空赋值转换为空列表。 这确保了该字段永远不为 null。

这项技术消除了整个代码中的空检查。 方法可以安全地对列表字段执行操作。 这是一个防御性编程实践,使代码更健壮。

带有泛型方法的 emptyList

emptyList 很好地适用于返回列表的泛型方法。 此示例显示了一个泛型方法,该方法返回一个具有正确类型参数的空列表。 编译器从上下文中推断类型。

EmptyListGeneric.java
package com.zetcode;

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

public class EmptyListGeneric {

    public static <T> List<T> createEmptyList() {
        return Collections.emptyList();
    }

    public static void main(String[] args) {
        // Type inferred from context
        List<String> strings = createEmptyList();
        List<Integer> numbers = createEmptyList();

        System.out.println("String list type: " + strings.getClass());
        System.out.println("Integer list type: " + numbers.getClass());

        // To compare the instances, use raw object references
        System.out.println("Same instance: " + (strings == (Object) numbers));
    }
}

此代码演示了 emptyList 的泛型用法。 该方法返回一个类型正确的空列表,无需进行类型转换。 无论类型参数如何,都将重用相同的不可变实例。

输出显示,虽然列表具有不同的泛型类型,但它们在运行时是相同的实例。 这是安全的,因为列表无法修改以违反类型安全。

Java Streams 中的 emptyList

emptyList 很好地适用于 Java Streams 作为源或结果。 此示例显示了在流操作中使用它。 空列表产生一个空流,可以安全地处理该流。

EmptyListStreams.java
package com.zetcode;

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

public class EmptyListStreams {

    public static void main(String[] args) {
        // Create stream from empty list
        List<String> empty = Collections.emptyList();
        long count = empty.stream().count();
        System.out.println("Stream count: " + count);
        
        // Use empty list as stream result
        List<String> result = empty.stream()
            .filter(s -> s.startsWith("A"))
            .toList();
        
        System.out.println("Filtered result: " + result);
        
        // Safe to call stream operations
        boolean anyMatch = empty.stream().anyMatch(s -> s.length() > 5);
        System.out.println("Any match: " + anyMatch);
    }
}

此代码演示了带有 Java Streams 的 emptyList。 空列表产生一个没有元素的流。 所有流操作都正确运行,无需对空输入进行特殊处理。

对空列表的流操作返回适当的空或 false 结果。 这种行为通常是可取的,并且与对空集的数学集合操作相匹配。

来源

Java Collections.emptyList 文档

在本文中,我们深入探讨了 Java 的 Collections.emptyList。 我们涵盖了基本用法、返回值、默认值以及与其他方法的比较。 理解 emptyList 有助于编写更简洁、更有效的 Java 代码。

作者

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

列出所有Java教程

© 2007 - 2025 Jan Bodnar admin(at)zetcode.com