ensureCapacity()方法提高ArrayList的初始化速度

本文通过对比实验展示了在使用ArrayList时,预先通过ensureCapacity()方法设置大小能显著提高初始化速度,尤其是在数据量大的情况下更为明显。通过代码实例说明了如何应用此方法,并给出了实际运行结果。

我们在使用Arraylist时,经常要对它进行初始化工作,在使用add()方法增加新的元素时,如果要增加的数据量很大,应该使用ensureCapacity()方法,该方法的作用是预先设置Arraylist的大小,这样可以大大提高初始化速度。
         请看代码:
   
Java代码
package test;   
  
import java.util.ArrayList;   
  
public class EnsureCapacityTest {   
    public static void main(String[] args){   
        final int N = 1000000;   
        Object obj = new Object();   
           
        //没用调用ensureCapacity()方法初始化ArrayList对象   
        ArrayList list = new ArrayList();   
        long startTime = System.currentTimeMillis();   
        for(int i=0;i<=N;i++){   
            list.add(obj);   
        }   
        long endTime = System.currentTimeMillis();   
        System.out.println("没有调用ensureCapacity()方法所用时间:" + (endTime - startTime) + "ms");   
           
        //调用ensureCapacity()方法初始化ArrayList对象   
        list = new ArrayList();   
        startTime = System.currentTimeMillis();   
        list.ensureCapacity(N);//预先设置list的大小   
        for(int i=0;i<=N;i++){   
            list.add(obj);   
        }   
        endTime = System.currentTimeMillis();   
        System.out.println("调用ensureCapacity()方法所用时间:" + (endTime - startTime) + "ms");   
    }   
}  

package test;

import java.util.ArrayList;

public class EnsureCapacityTest {
	public static void main(String[] args){
		final int N = 1000000;
		Object obj = new Object();
		
		//没用调用ensureCapacity()方法初始化ArrayList对象
		ArrayList list = new ArrayList();
		long startTime = System.currentTimeMillis();
		for(int i=0;i<=N;i++){
			list.add(obj);
		}
		long endTime = System.currentTimeMillis();
		System.out.println("没有调用ensureCapacity()方法所用时间:" + (endTime - startTime) + "ms");
		
		//调用ensureCapacity()方法初始化ArrayList对象
		list = new ArrayList();
		startTime = System.currentTimeMillis();
		list.ensureCapacity(N);//预先设置list的大小
		for(int i=0;i<=N;i++){
			list.add(obj);
		}
		endTime = System.currentTimeMillis();
		System.out.println("调用ensureCapacity()方法所用时间:" + (endTime - startTime) + "ms");
	}
}


输出结果:
没有调用ensureCapacity()方法所用时间:110ms
调用ensureCapacity()方法所用时间:31ms
        结果显而易见,在N的值很大的时候,使用ensureCapacity()方法可大大提高效率;而当N的值较小时,则所用时间差距不明显,这里就不在赘诉,如果感兴趣,各位网友可以自己试试。

### C++ 中初始化 `vector` 并指定其大小 在 C++ 中,可以通过多种方式创建具有特定大小的 `vector`。为了确保支持 C++11 的特性,需按照描述,在开发环境中配置 `-std=c++11` 编译选项[^1]。 #### 使用默认构造函数初始化 可以利用带有参数的构造函数来定义向量及其元素的数量以及可选的初始值: ```cpp #include <iostream> #include <vector> int main() { int size = 5; std::vector<int> vec(size); // 创建含有五个零值整数的 vector for (auto &item : vec) { item = 1; // 给每个位置赋初值 } for (const auto &value : vec){ std::cout << value << ' '; } } ``` 上述代码片段展示了如何声明一个包含五个整型元素且全部被赋予数值 `1` 的一维数组。 #### Java初始化 `ArrayList` 或者固定长度数组模拟 Vector 行为 Java 不具备内置名为 `vector` 的容器类;然而,通常会使用 `ArrayList` 来代替它。对于需要预先设定容量的情况,虽然不能直接通过构造器设置确切大小,但是能够调用 `ensureCapacity()` 方法预留空间以提高性能效率。 如果确实想要拥有不可变尺寸的数据结构,则应该考虑采用传统的一维数组形式。 ##### ArrayList 初始化例子: ```java import java.util.ArrayList; public class Main { public static void main(String[] args) { final int SIZE = 7; ArrayList<Integer> list = new ArrayList<>(SIZE); while(list.size() < SIZE){ list.add(0); // 添加占位符直到达到所需大小 } System.out.println("List with initial elements: " + list); // 更新列表中的每一个项 for(int i=0;i<SIZE;++i){ list.set(i,i*2); } System.out.println("Updated List: "+list); } } ``` 此段程序先填充了七个 `Integer` 类型的对象到集合里,默认都是 `0` 值,之后再遍历修改这些成员变量的内容[^2]。 ##### 固定长度数组的例子: ```java class FixedSizeVectorExample { private Integer[] fixedArray; public FixedSizeVectorExample(final int length) { this.fixedArray = new Integer[length]; for (int index = 0; index < length; ++index) { fixedArray[index] = null; // 显式置空或设其他初始值 } } // ... getter/setter methods and other functionalities ... } // Usage example: FixedSizeVectorExample fsve = new FixedSizeVectorExample(8); ``` 这里展示了一个简单的自定义类实现方法,该类内部维护着一个预分配好内存区域的一维数组作为存储介质。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值