-2

我有一个以这种方式定义的集合,没有指定大小 -

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");
}

由于 Collection 是最终的,我应该构建它以使其具有特定大小吗?

4

5 回答 5

3

设置 的初始大小ArrayList,可以减少重新分配内部存储器的次数。如果你ArrayList在构造函数中创建一个没有设置容量的值,它将使用默认值创建,我猜是 10。ArrayList是一个动态调整大小的数据结构,实现为具有初始(默认)固定大小的数组。如果您知道项目的上限,那么我想创建具有初始长度的数组会更好。

根据ArrayList()构造函数的文档:

构造一个初始容量为 10 的空列表。

ArrayList(int initialCapacity)

构造一个具有指定初始容量的空列表。

由于 Collection 是最终的,我应该构建它以使其具有特定大小吗?

引用变量是final,它只能指向一个对象,在本例中为ArrayList. 这并不意味着ArrayList不能更改其自身的内容或属性。参考JLS 4.12.4

一旦分配了最终变量,它总是包含相同的值。如果最终变量持有对对象的引用,则对象的状态可能会通过对对象的操作而改变,但变量将始终引用同一个对象。

于 2013-07-12T20:07:32.023 回答
1

正如官方 JavaDoc所说:

public ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。
public ArrayList() 构造一个初始容量为 10 的空列表。

因此,如果您不打算添加更多元素,则第一种方法需要更少的内存。但是,如果您要向集合中添加更多元素,则第二种方法不需要尽快重新分配新的支持数组。

于 2013-07-12T20:08:17.497 回答
0

第二种方式将为您节省一点内存(默认初始容量等于 10)。假设您不会更改列表的内容(当您向其中添加新元素时,底层数组会增长)。

请注意,集合不是不可变的(),只有引用是最终的。对于不可变列表,使用Collections.unmodifiableListCollections.unmodifiableCollection方法如下:

private final static Collection<String> mycollection;     
static {
    List<String> tempList = new ArrayList<String>(1);
    tempList.add("mystr");
    mycollection = Collections.unmodifiableCollection(tempList);
}
于 2013-07-12T20:09:49.383 回答
0

如果您未在其中传递任何参数,则默认情况下,ArrayList 会在其内部数据结构中创建 10 个元素的数组。

但是,如果您为其分配 initialCapacity 参数,则您正在为其分配一个初始值,当您提前知道 ArrayList 的大小时,这可能会提高性能。

公共 ArrayList(int initialCapacity)

因此,在您的情况下,如果只有一个元素,它没有任何区别,但列表会增加更多,降低初始容量将使其再次重新创建数组。

于 2013-07-12T20:10:13.807 回答
0

前者使用ArrayList构造函数,初始默认容量为 10(参考上一个链接),而后者使用ArrayList(int)构造函数,您将设置初始容量。

如果我初始化,我们是否会对内存或性能产生任何影响。

如果在使用 256 MB 时为初始阵列配置节省至少 9 个字节,那么我会说不

如果您担心内部array使用的初始容量ArrayList,这里有两个关于该主题的优秀 Q/A:

于 2013-07-12T20:07:29.027 回答