Nar*_*hai 3 java collections arraylist
从最近发布的一个问题中,我遇到了ArrayList#trimToSize(),它将支持数组的大小减小到当前的集合大小.
引用javadoc
将此ArrayList实例的容量调整为列表的当前大小.应用程序可以使用此操作来最小化ArrayList实例的存储.
Javadoc说应用程序可以用来减少后备阵列的内存占用.如果我没有错,这种方法对于小尺寸不会有用,因为一些参考的成本不会那么大.
但是由于arraylist int newCapacity = (oldCapacity * 3)/2 + 1;在1.6和int newCapacity = oldCapacity + (oldCapacity >> 1);1.7中使用的算法,当添加新元素if oldcapacity大时,它将创建具有上述算法的新后备数组,并且如果在动态扩展之后仅添加一个元素,则可以分配更多不需要的空间.
我的理由是正确的方法背后还是有其他一些应用程序?
是的,支持阵列在满员时增加了约50%.例如,下面的程序增加了100万个条目,trimToSize然后调用添加一个条目.添加条目后,背衬阵列的长度为1.2米,修剪后1米,添加一个项目后1.5米.
因此,除非您知道不再添加到列表中,trimToSize否则调用可能会适得其反.
ArrayList<Integer> list = new ArrayList<>();
Field e = list.getClass().getDeclaredField("elementData");
e.setAccessible(true);
for (int i = 0; i < 1_000_000; i++) {
list.add(i);
}
System.out.println(((Object[]) e.get(list)).length); //1215487
list.trimToSize();
System.out.println(((Object[]) e.get(list)).length); //1000000
list.add(0);
System.out.println(((Object[]) e.get(list)).length); //1500000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1327 次 |
| 最近记录: |