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 的最基本用法。 我们获取一个空列表并验证其属性。 该列表确实是空的并且是不可变的。
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 设计实践。
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 实例。
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 很好地适用于返回列表的泛型方法。 此示例显示了一个泛型方法,该方法返回一个具有正确类型参数的空列表。 编译器从上下文中推断类型。
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 作为源或结果。 此示例显示了在流操作中使用它。 空列表产生一个空流,可以安全地处理该流。
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。 我们涵盖了基本用法、返回值、默认值以及与其他方法的比较。 理解 emptyList 有助于编写更简洁、更有效的 Java 代码。
作者
列出所有Java教程。