Java Arraylist的内存和性能

时间:2015-07-10 07:21:14

标签: java arraylist

我编写了Java代码,用于从数据库中获取员工姓名列表并将其存储在列表中。

List<String> employeeList = new ArrayList<Integer>();
employeeList = getAllEmployee();

我的数据库定期更改,员工人数每天增加或减少。

通常逻辑我可以使用的是来自DB的getcount并从该计数创建Arraylist。

我有一个想法。现在,如果我有来自DB的3名员工,如果我创建Arraylist,我将创建10的初始容量。有没有办法从ArrayList中删除未使用的空间7。另外请告诉我初始容量算法和负载因子。

3 个答案:

答案 0 :(得分:0)

我认为这就是您正在寻找的 java.util.ArrayList.trimToSize()方法,它将ArrayList实例的容量调整为当前大小。它将最小化ArrayList实例的存储

doclink

答案 1 :(得分:0)

是的,有一种方法可以删除未使用的空间。您可以使用方法trimToSize(),根据其Javadoc,

  

将此ArrayList实例的容量修剪为列表的当前大小。

请注意,这需要将List向下传播到ArrayList

Oracle Java 8运行时中ArrayList的当前实现具有私有方法grow()。如果您安装了JDK,我可以看到实现,我想。它不适用于“负载因子”。但使用不同的算法来确定底层阵列的新容量:

int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);

另外,它会进行一些边界检查,以确保int不会溢出,但这是一个不同的故事。

答案 2 :(得分:0)

您可以创建一个大小等于所需大小的列表。

List<String> list = new ArrayList<String>(desiredSize);

请注意您编写的代码

List<String> employeeList= new arrayList()<Integer>;
employeeList= getAllEmployee();

概率地创建两个列表。一个明确的,getAllEmployee()代码中的第二个。所以最好的是

List<String> employeeList = getAllEmployee() 

并在你的getAllEmployee代码中执行类似的操作

public List<String> getAllEmployee() {
    ...
    int desiredSize = ....
    ...
    List<String> list = new ArrayList<String>(desiredSize);
    ...
    return list;
}

注意如果您没有处于极其优化的环境中(我认为您不是其他人没有要求这种问题),则无需保存少量字节。如果代码的可读性较差,并且您必须通过额外调用数据库来计算所需的大小,那么这不是一个好的编程选择。