欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

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

来源: javaer 分享于  点击 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的长度有明显的把控时 最好自定义其扩容方法来提高程序的执行效率。

相关文章

    暂无相关文章

用户点评