开发易忽视问题:巧用java Collections.emptyList() 方法

1 阅读2分钟

在 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一个对象开销。