如果我需要初始化一个静态最终集合

问题描述 投票:0回答:6

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

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

既然集合是最终的,我应该构建它以使其具有特定的大小吗?

java final
6个回答
3
投票

设置

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

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

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

而 , ArrayList(int initialCapacity)

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

既然集合是最终的,我是否应该构建它以使其具有特定的大小?

引用变量是

final
,它只能指向一个对象,在本例中是
ArrayList
。这并不意味着
ArrayList
本身的内容或属性不能更改。请参阅JLS 4.12.4

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


1
投票

正如官方 JavaDoc 所说:

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

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


0
投票

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

但是,如果您为其指定初始容量参数,则为它分配一个初始值,当您事先知道 ArrayList 的大小时,这可能会提高性能。

公共ArrayList(int初始容量)

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


0
投票

第二种方式会节省一点内存(默认初始容量等于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);
}

0
投票

前者使用 empty

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

如果我初始化,会对内存或性能产生影响吗?

如果在有 256 MB 可用空间时为初始阵列配置保存至少 9 个字节,那么我会说

如果您担心

array
使用的内部
ArrayList
的初始容量,这里有两个关于该主题的精彩问答:


0
投票

我正在阅读“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 添加到员工集合中?

© www.soinside.com 2019 - 2024. All rights reserved.