int size = 1000000;
ArrayList<Integer> list1 = new ArrayList<Integer>(size);
long start = System.currentTimeMillis();
for(int i=0; i<size; i++)
list1.add(i);
System.out.println(System.currentTimeMillis()-start);
Vector<Integer> list2 = new Vector<Integer>(size);
start = System.currentTimeMillis();
for(int i=0; i<size; i++)
list2.add(i);
System.out.println(System.currentTimeMillis()-start);
结果:
141
125
------解决方案--------------------
实验有几个问题:
1 - 有没有考虑在试验中尽量排除可能存在的差异,比如频繁装箱效率可能存在的差异?
2 - 有没有考虑 CPU cache 可能的影响?
3 - 据说 JDK 6 以后,如果JVM能够明显发现对一个 Vector 的访问必定在一个单线程内,则会优化省略 synchronized 时间,楼主的实验中,两个变量 list1 和 list2 都是局部变量,事实上被单线程拘禁。
4 - 测试时间的时候,重要的是精确的时间差而不是事实上的几点几分几秒,所以应该用 nanoTime() 而不是 currentTimeInMillis()
实验更改如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class Test {
private static int size = 10000000;
private static Vector<Integer> list2 = new Vector<Integer>(size);
private static ArrayList<Integer> list1 = new ArrayList<Integer>(size);
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>(size);
for(int i=0; i<size; i++)
list.add(i);
long start = System.nanoTime();
for (int i = 0; i < size; i++)
list2.add(list.get(i));
System.out.println(System.nanoTime() - start);
start = System.nanoTime();