java可以创建固定大小数组或使用列表类实现类似功能。本文我简要说明下ArrayList容量和数组大小区别,同时也说明初始化ArrayList时如何指定其容量大小。
1. 示例展示两者差异
首先创建数组,java需要强制指定大小。
Integer[] array = new Integer[100];
System.out.println("Size of an array:" + array.length);
这里指定数组大小为100,结果为:Size of an array:100
接着创建ArrayList,使用初始容量也为100:
List<Integer> list = new ArrayList<>(100);
System.out.println("Size of the list is :" + list.size());
结果为:Size of the list is :0
在没有加入元素时其大小为0。现在增加一个元素再检查其大小:
list.add(10);
System.out.println("Size of the list is :" + list.size());
结果为:Size of the list is :1
2. 对比数组大小和列表容量
数组是固定大小,一旦数组使用int值初始了其大小,则不能再改变。其大小和容量是相等的。
ArrayList大小和容量不是固定的。列表的逻辑大小随着插入、删除操作而改变,和实际物理存储大小分别进行管理。当达到ArrayList列表容量的阈值时,会扩展其容量用于存储更多元素。
数组内存在创建时分配。当初始化数组时,会根据其数组大小和元素类型分配内存。对于引用类型初始化为null,原始类型为其默认值。
ArrayList随这其元素增长改变内存分配。初始化ArrayList时指定容量,其分配足够空间存储元素直到达到容量,这时扩展容量,创建新的、更大的列表,并拷贝原来的值到新的列表。
3. ArrayList初始化容量
我们可能想在创建ArrayList之前确定其容量,通常这不是必须的,但至少需要了解其中原理。
当我们知道元素大小时,使用确切的大小初始化ArrayList非常好,从而避免高昂的增长及拷贝操作。类似地,如果列表非常大,自动增长操作可能会分配比实际所需更多的内存。这是因为每次增长数量是按照到目前为止大小的比例计算的。因此对于大型列表,这可能会导致内存浪费。
如果我们有很多小集合,那么数组列表的自动容量可能会提供大量浪费的内存。假设ArrayList初始容量大小为10,需要存储的元素只有2或3个元素。这意味着70%的内存被浪费,如果我们有很多这样的列表,这可能非常浪费。
对于灵活大小对象容器,ArrayList是非常好的解决方案。它支持随机访问,比数组稍微多占用点内存,但提供了丰富的集合操作。
在一些场景中,特别对于非常大的原始类型集合,使用标准数组可能更快、占用空间更少。类似的,存储可变元素且不需要索引访问,LinkList性能更好,无需额外的内存管理。
4. 总结
本文对比ArrayList容量和数组大小。同时也简要说明了ArrayList初始化容量及避免内存空间浪费。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/115287833