我有一个以这种方式定义的集合,没有指定大小 -
private final static Collection<String> mycollection = new ArrayList<String>();
static {
mycollection.add("mystr");
}
还有一个需要大小的构造函数,例如
private final static Collection<String> mycollection = new ArrayList<String>(1);
static {
mycollection.add("mystr");
}
既然集合是最终的,我应该构建它以使其具有特定的大小吗?
设置
ArrayList
的初始大小,可以减少内部存储器重新分配的次数。如果您创建一个 ArrayList
而不在构造函数中设置容量,它将使用默认值创建,我猜是 10。 ArrayList
是一个动态调整大小的数据结构,实现为具有初始(默认)固定大小的数组。如果您知道项目的上限,那么我认为创建具有初始长度的数组会更好。
根据 ArrayList() 构造函数的文档:
构造一个初始容量为 10 的空列表。
而 , ArrayList(int initialCapacity)
构造一个具有指定初始容量的空列表。
既然集合是最终的,我是否应该构建它以使其具有特定的大小?
引用变量是
final
,它只能指向一个对象,在本例中是 ArrayList
。这并不意味着 ArrayList
本身的内容或属性不能更改。请参阅JLS 4.12.4
一旦最终变量被分配,它总是包含相同的值。 如果最终变量保存对对象的引用,则该对象的状态可能会通过对该对象的操作而更改,但该变量将始终引用同一个对象。
正如官方 JavaDoc 所说:
构造一个具有指定初始容量的空列表。public ArrayList(int initialCapacity)
构造一个初始容量为 10 的空列表。public ArrayList()
因此,如果您不打算添加更多元素,第一种方法需要更少的内存。但是,如果您要向集合添加更多元素,则第二种方法不需要尽快重新分配新的支持数组。
默认情况下,如果您未在其中传递任何参数,ArrayList 会在其内部数据结构中创建包含 10 个元素的数组。
但是,如果您为其指定初始容量参数,则为它分配一个初始值,当您事先知道 ArrayList 的大小时,这可能会提高性能。
公共ArrayList(int初始容量)
因此,在您的情况下,如果只有一个元素,则没有任何区别,但如果列表将增加更多,则降低初始容量将使其再次重新创建数组。
第二种方式会节省一点内存(默认初始容量等于10)。假设您不会更改列表的内容(当您向其中添加新元素时,底层数组将会增长)。
请注意,集合不是不可变的(!),只有引用是最终的。对于不可变列表,请使用
Collections.unmodifiableList
或 Collections.unmodifiableCollection
方法,如下所示:
private final static Collection<String> mycollection;
static {
List<String> tempList = new ArrayList<String>(1);
tempList.add("mystr");
mycollection = Collections.unmodifiableCollection(tempList);
}
前者使用 empty
ArrayList
构造函数,初始默认容量为 10(参考上一个链接),而后者使用 ArrayList(int)
构造函数,您将设置初始容量。
如果我初始化,会对内存或性能产生影响吗?
如果在有 256 MB 可用空间时为初始阵列配置保存至少 9 个字节,那么我会说不。
如果您担心
array
使用的内部 ArrayList
的初始容量,这里有两个关于该主题的精彩问答:
我正在阅读“Java 教程继续,JDK 的其余部分/Mary Campione,
enter code here
...”。
在收藏章节中,我遇到了以下问题,但我无法理解它们:
我们有一个名为 EmployeeRecord 的类:
**public class EmployeeRecord implements Comparable {
public Name name();
public int employeeNumber();
public Date hireDate();
...
}**
我们假设 EmployeeRecord 对象的自然顺序是名称顺序
import java.util.*;
class EmpSort {
static final Comparator SENIORITY_ORDER = new Comparator() {
public int compare(Object o1, Object o2) {
EmployeeRecord r1 = (EmployeeRecord) o1;
EmployeeRecord r2 = (EmployeeRecord) o2;
return r2.hireDate().compareTo(r1.hireDate());
}
};
静态最终集合员工 = ... ; // 员工数据库
public static void main(String args[]) {
List emp = new ArrayList(employees);
Collections.sort(emp, SENIORITY_ORDER);
System.out.println(emp);
}
}
我对 EmployeeRecord 类有问题,我的意思是该类的其余部分是什么,第二个问题应该是什么 Emplyee 数据库的其余部分,我的意思是如何将 EmployeeRecord 添加到员工集合中?