在 Java 中,Collections.emptyList()
和 new ArrayList<>()
都可以用于创建一个空列表,但它们有一些不同的特性和用途。以下是对两者的详细比较:
1. 内存消耗
-
Collections.emptyList()
- 它返回的是一个预定义的、不可变的空列表实例,不会额外占用内存。
- 由于这是一个共享的常量对象,因此不会为每次调用创建新的对象,节约了内存。
-
new ArrayList<>()
- 每次调用都会创建一个新的
ArrayList
实例,即使它是空的,也会分配一些初始空间。 - 相较于
Collections.emptyList()
, 它会多消耗一些内存,因为每次创建时都需要分配对象头和可能的初始容量。
- 每次调用都会创建一个新的
2. 可变性
-
Collections.emptyList()
- 返回的是一个不可变的空列表。如果试图修改这个列表(比如添加或删除元素),会抛出
UnsupportedOperationException
。 - 适用于确保列表不被修改的场景。
- 返回的是一个不可变的空列表。如果试图修改这个列表(比如添加或删除元素),会抛出
-
new ArrayList<>()
- 返回的是一个可变的空列表,可以自由地添加、删除和修改元素。
- 适用于需要动态操作列表的场景。
3. 性能
-
Collections.emptyList()
- 返回的空列表是共享的单例,创建速度极快,没有对象分配和初始化的开销。
-
new ArrayList<>()
- 需要分配和初始化新的
ArrayList
对象,存在一些开销。
- 需要分配和初始化新的
4. 用例示例
使用 Collections.emptyList()
示例:
import java.util.Collections;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<String> emptyList = Collections.emptyList();
// 尝试修改将抛出异常
// emptyList.add("Hello"); // UnsupportedOperationException
System.out.println(emptyList.size()); // 输出: 0
}
}
使用 new ArrayList<>()
示例:
import java.util.ArrayList;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<String> arrayList = new ArrayList<>();
// 可以自由修改
arrayList.add("Hello");
System.out.println(arrayList.size()); // 输出: 1
}
}
总结
-
Collections.emptyList()
- 优点:高性能、低内存消耗、不变对象。
- 缺点:不可修改。
- 使用场合:需要一个不可变的空列表时。
-
new ArrayList<>()
- 优点:可变对象,可以添加和删除元素。
- 缺点:相对较高的内存消耗和创建开销。
- 使用场合:需要对列表进行动态操作时。
应用场景
假如客户端同学要求服务端返回的接口,需要返回所有的字段信息,那么针对接口返回的对象中,没有数据的List字段信息,可以使用Collections.emptyList(),减少每次查询接口时new一个对象开销。