我是一个有点经验的 Java 开发人员,我经常看到这样的事情
List<Integer> l = new ArrayList<Integer>(0);
我实在是看不懂。当您知道它会增长到超出容量时,创建初始容量为 0 的 ArrayList
有什么意义?
这样做有什么已知的好处吗?
最佳答案
它使 ArrayList
的大小(在内存中)非常小,当您希望变量为非 null 并准备好使用时,这是一种策略,但不要 expect List
立即被填充。如果您希望它立即被填充,最好给它一个更大的初始值 - ArrayList
的任何“增长”都是在内部创建一个新的原始数组,并将项目复制过来。 ArrayList
的增长是昂贵的,应该尽量减少。
或者,如果您正在创建一个类的大量 实例,每个实例都包含这些List
属性之一。如果您不立即计划填充它们,您可以通过暂时不分配房间来节省一些内存。
但是:有一个更好的方法:Collections.emptyList()
。通常您会希望直接保护对该列表的访问,并且(例如)在您的类中提供对内部 List
进行操作的特定于域的方法调用。例如,假设您有一个包含学生姓名的 List
的 School
类。 (为简单起见,请注意此类不是线程安全的。)
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/