public class test1 {
public static void main(String[] args) {
//第一个列表
ArrayList<Integer> list1 = new ArrayList<Integer>();
long start1 = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
list1.add(i);
}
System.out.println("第一个列表花费" + (System.currentTimeMillis() - start1) + "毫秒");
//第二个列表
ArrayList<Integer> list2 = new ArrayList<Integer>();
long start2 = System.currentTimeMillis();
for (int i = 10000000; i < 20000000; i++) {
list2.add(i);
}
System.out.println("第二个列表花费" + (System.currentTimeMillis() - start2) + "毫秒");
}
}
同样都是插入1000万条数据。
为什么第一个花费了6000ms,而第二个只用了500ms,差距怎么这么大?
我把第二个列表的代码移到前面,结果还是一样:先运行的花费时间久,后运行的花费的时间很短
逻辑和语法上,是没有差别的。特别是你两个列表的类型都是ArrayList类型,所以结果运行的时间应该是一致的。
将你的代码在我自己机子上测试了一下,得出的结论也是二者基本相等,没有出现你说的这种情况。
应该是你运行程序的Eclipse的问题吧。或者是初始化的原因。
测试了一下,在前面的可能初始化花了一点时间,每个人的机器不一样,初始化花的时间也可能不一样。
我的测试结果:
第一个列表花费3008毫秒
第二个列表花费2060毫秒
这是个很有意思的问题。
1、把上面的代码分开放到两个线程中去执行,耗时是差不多的;
2、然后去掉线程,将进程虚拟机内存调大,结果时间变得很快而且耗时相近,设置参数为-Xms1024m -Xmx1024m;
3、然后猜是最小堆内存过小,导致需要不断申请操作系统内存导致的,又把参数设置成-Xms512m -Xmx1024m,结果反而第一个执行的快,第二个执行的慢,与楼主秒数截然相反,因此感觉和内存回收机制有关系
[GC 33280K->23020K(124928K), 0.0272707 secs]
[GC 56300K->44171K(158208K), 0.0344575 secs]
[GC 91592K->91475K(158208K), 0.0657366 secs]
[Full GC 91475K->80638K(261120K), 0.8329706 secs]
[GC 183253K->159301K(294400K), 0.1358376 secs]
[Full GC 159301K->143191K(412160K), 0.8929746 secs]
[GC 243031K->243122K(445440K), 0.1350438 secs]
[Full GC 243122K->206940K(605696K), 1.3676401 secs]
第一个列表花费3603毫秒
[GC 323010K->291029K(691712K), 0.0853497 secs]
[GC 419541K->379555K(704000K), 0.1820072 secs]
第二个列表花费360毫秒
个人测试结果基本上多数差别不大,应该是可机器某个时刻的资源使用有关系吧