我编写了Java代码,用于从数据库中获取员工姓名列表并将其存储在列表中。
List<String> employeeList = new ArrayList<Integer>();
employeeList = getAllEmployee();
我的数据库定期更改,员工人数每天增加或减少。
通常逻辑我可以使用的是来自DB的getcount并从该计数创建Arraylist。
我有一个想法。现在,如果我有来自DB的3名员工,如果我创建Arraylist,我将创建10的初始容量。有没有办法从ArrayList中删除未使用的空间7。另外请告诉我初始容量算法和负载因子。
答案 0 :(得分:0)
我认为这就是您正在寻找的 java.util.ArrayList.trimToSize()方法,它将ArrayList实例的容量调整为当前大小。它将最小化ArrayList实例的存储
答案 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;
}
注意如果您没有处于极其优化的环境中(我认为您不是其他人没有要求这种问题),则无需保存少量字节。如果代码的可读性较差,并且您必须通过额外调用数据库来计算所需的大小,那么这不是一个好的编程选择。