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教程。