Mau*_*ren 7 java arraylist capacity
我是一位经验丰富的Java开发人员,我一直在看这样的事情
List<Integer> l = new ArrayList<Integer>(0);
Run Code Online (Sandbox Code Playgroud)
我真的无法理解.ArrayList当你知道它将超出容量时,创建一个初始容量为0的重点是什么?
这样做有什么好处吗?
它保持的大小(在内存中)ArrayList非常小,是因为当你想要的变量为非空,并准备使用的策略,但不要指望在List立即填充.如果你希望它立即被填充,最好给它一个更大的初始值 - 任何"增长"的ArrayList内部创建一个新的原始数组,并复制项目.a的增长ArrayList是昂贵的,应该最小化.
或者,如果你正在创建大量的类的实例,每个包含这些中的一个List属性.如果你没有立即计划填充它们,你可以通过不分配房间来节省一些内存.
但是:有一种更好的方法:Collections.emptyList().通常,您需要直接保护对该列表的访问,并且(作为示例)您的类中提供在内部运行的特定于域的方法调用List.例如,假设您有一个School包含List学生姓名的班级.(保持简单.)
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意进行isEmpty()检查并执行初始化/赋值,那么这是创建大量空ArrayList实例的更好选择,因为Collections.emptyList()静态实例(只存在一个)并且不可修改.
对于java 6(或openjdk 7),未指定初始大小会为您提供初始大小设置为10的列表.因此,根据您使用列表的许多因素,使用大小初始化列表可能会略微提高内存和/或性能0.
对于java 7,指定初始大小0在功能上等同于不指定初始大小.
但实际上效率较低,因为使用参数调用构造函数0会引发调用new Object[0],而如果指定no-args构造函数,则elementData列表的初始值将设置为静态定义的常量EMPTY_ELEMENTDATA.
ArrayList来源的相关代码:
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
Run Code Online (Sandbox Code Playgroud)
换句话说,使用new ArrayList<Integer>(0);似乎是多余的,这样做没有任何好处,我会反而使用new ArrayList<Integer>();.
| 归档时间: |
|
| 查看次数: |
2312 次 |
| 最近记录: |