2015-07-10 82 views
0

我已经编写了Java代码以从数据库获取员工姓名列表并将其存储在列表中。Java Arraylist的内存和性能

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

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

通常情况下,我可以使用的是从数据库中获取计数并从该计数创建Arraylist。

我有一个想法。现在,如果我有来自DB的3名员工,如果我创建了Arraylist,我将创建10个初始容量。是否有任何方法可以从ArrayList中删除未使用的空间7。也请关于初始容量算法和负载系数的启发。

+1

如果您想要一个具有特定容量的数组列表,您应该使用以容量作为参数的构造函数。 –

+0

我叮叮当当,你在这里提出的问题还不是很清楚,如果你真的想要一个具有特定容量的ArrayList,请执行Andy Turner所说的话。但是,我觉得你正在寻找一种方法来从现有数据库中检索数据(?) – RedSonja

+0

即使在修改拼写错误之后,代码也不会编译。 'employeeList'用于保存'String'或'Integer'对象吗? –

回答

0

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

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

请注意,顺便提一下,这需要将List向下转换为ArrayList

Oracle的Java 8运行时中的ArrayList的当前实现有一个私有方法grow()。我想,如果你安装了JDK,你可以看到实现。它不以“负荷率”的工作,但使用不同的算法来确定潜在的阵列的新产能:

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

加上它做了一些边界检查,以确保int就做不溢出,但这是一个不同的故事。

+0

使用trimToSize()减小容量后,如果我们想再次增加容量。它是否自动增加? –

+1

是的,调用'add(...)'总是可以确保底层数组中有足够的容量。 – mthmulders

0

我认为这是你正在寻找的java.util.ArrayList.trimToSize()方法,该方法将ArrayList实例的容量修剪为当前大小。这将减少一个ArrayList实例

doclink

0

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

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

请注意,你的代码写

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

probabilly创建两个列表。一个明确的,第二个内部代码getAllEmployee()。所以最好是

List<String> employeeList = getAllEmployee() 

,并在您getAllEmployee代码做这样的事情

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

注意,如果你不是在一个非常优化的环境(我想你是不是否则你没有要求这种问题),没有必要保存几个字节。如果代码的可读性差,并且必须通过额外的数据库调用来计算所需的大小并不是一个好的编程选择。

+0

该方法是否可用于jdk 7? – shreekanth

+0

是的,它自java.util.ArrayList(java 1.2)的第一个版本开始可用 –