您的位置:首页 > 其它

【集合框架知识总结】ArrayList 中 ensureCapacity 使用

2018-03-27 15:21 288 查看
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的长度有明显的把控时 最好自定义其扩容方法来提高程序的执行效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: