【集合框架知识总结】ArrayList 中 ensureCapacity 使用,
分享于 点击 40987 次 点评:103
【集合框架知识总结】ArrayList 中 ensureCapacity 使用,
- ensureCapacity方法源码:
/** * Increases the capacity of this <tt>ArrayList</tt> instance, if * necessary, to ensure that it can hold at least the number of elements * specified by the minimum capacity argument. * * @param minCapacity the desired minimum capacity */ public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
根据传入的值进行扩容 默认的扩容规则为 old*1.5+1
- ensureCapacity使用场景
private static final int DEFAULT_CAPACITY = 10; //ArrayList 初始容量(不是指new ArryList().size())
假如要对一个ArrayList要插入大量的数据 类似下面这种:
ArrayList<Object> list = new ArrayList<Object>();
for (int i = 1; i < 10000000; i++) {
list.add(new Object());
}
list 在 16,25,38,58,88,133,200,301..........大小处进行扩容操作(拷贝操作+新增容量),这样频繁的操作会很影响其插入效率。
- ensureCapacity使用对比
@Test
public void ensureCapacityTest() {
long startTime = System.currentTimeMillis();
ArrayList<Object> list1 = new ArrayList<Object>();
for (int i = 1; i < 10000000; i++) {
list1.add(new Object());
}
System.out.println(System.currentTimeMillis() - startTime);
//3765
long startTime2 = System.currentTimeMillis();
ArrayList<Object> list2 = new ArrayList<Object>();
list2.ensureCapacity(10000000);
for (int i = 1; i < 10000000; i++) {
list2.add(new Object());
}
System.out.println(System.currentTimeMillis() - startTime2);
//813
}
可以看出来在ArryList数据长度和数据量过大的情况下初始化理想的ArryList容积的效率明显高于自动扩容
所以在项目中有些业务处理时候对ArryList的长度有明显的把控时 最好自定义其扩容方法来提高程序的执行效率。
相关文章
- 暂无相关文章
用户点评