当前位置: 代码迷 >> J2SE >> ArrayList Vector,该如何处理
  详细解决方案

ArrayList Vector,该如何处理

热度:551   发布时间:2016-04-23 21:59:30.0
ArrayList Vector
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();
  相关解决方案