java - 创建初始容量为 0 的 ArrayList 的优点?

标签 java arraylist capacity

我是一个有点经验的 Java 开发人员,我经常看到这样的事情

List<Integer> l = new ArrayList<Integer>(0);

我实在是看不懂。当您知道它会增长到超出容量时,创建初始容量为 0 的 ArrayList 有什么意义?

这样做有什么已知的好处吗?

最佳答案

它使 ArrayList 的大小(在内存中)非常小,当您希望变量为非 null 并准备好使用时,这是一种策略,但不要 expect List 立即被填充。如果您希望它立即被填充,最好给它一个更大的初始值 - ArrayList 的任何“增长”都是在内部创建一个新的原始数组,并将项目复制过来。 ArrayList 的增长是昂贵的,应该尽量减少。

或者,如果您正在创建一个类的大量 实例,每个实例都包含这些List 属性之一。如果您不立即计划填充它们,您可以通过暂时不分配房间来节省一些内存。

但是:有一个更好的方法:Collections.emptyList()。通常您会希望直接保护对该列表的访问,并且(例如)在您的类中提供对内部 List 进行操作的特定于域的方法调用。例如,假设您有一个包含学生姓名的 ListSchool 类。 (为简单起见,请注意此类不是线程安全的。)

public class School {
    private List<String> studentNames = Collections.emptyList();

    public void addStudentName(String name) {
        if (studentNames.isEmpty()) {
            studentNames = new ArrayList<String>();
        }
        studentNames.add(name);
    }

    public void removeStudentName(String name) {
        studentNames.remove(name);
        if (studentNames.isEmpty()) {
            studentNames = Collections.emptyList(); // GC will deallocate the old List
        }
    }
}

如果您愿意进行 isEmpty() 检查并执行初始化/赋值,这是创建大量空 ArrayList 实例的更好选择,因为Collections.emptyList() 是一个静态实例(仅存在一个)并且不可修改。

关于java - 创建初始容量为 0 的 ArrayList 的优点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28345520/

相关文章:

Java 游戏 - 如何使用 Arraylist 添加敌人?

java - 如何使用SharedPreference保存自定义ArrayList?

C# List<GenericClass>(100) 构造原理

tfs - Azure DevOps (VSTS/TFS) 迭代容量选项卡下的新字段

java - 在Java中,如何在两个不同的列中为相同的数据类型设置单元格编辑器?

java - 在启动时创建新实例

java - 我的对象值不会保存。显示空

java - 如何计算String Buffer的容量?

java - 线程ID=9 : thread exiting with uncaught exception (group=0x40015560)

java - 如何以管理员身份发布到 Facebook 粉丝专页墙