以下代码演试ArryList,LinkedList,Vector,HaspMap, Hashtable五个类,在进行同等次数的循环后的时间对比import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.Vector;public class T1
{ /**
 * @param args
 */
public static void main(String[] args)
{   
Vector v=new Vector();
LinkedList llist=new LinkedList();
ArrayList alist=new ArrayList();
Hashtable table=new Hashtable();
HashMap map=new HashMap();

//Vector
long s1=System.currentTimeMillis();
for(int i=0;i<300000;i++)
v.add("haha");
long s2=System.currentTimeMillis();
System.out.println("Vector write cost:"+(s2-s1));
long s3=System.currentTimeMillis();
for(int i=0;i<300000;i++)
{String s=(String)(v.get(i));}
long s4=System.currentTimeMillis();
                  System.out.println("Vector read cost:"+(s4-s3));

//ArrayList
                  long s5=System.currentTimeMillis();
for(int i=0;i<300000;i++)
alist.add("haha");
long s6=System.currentTimeMillis();
System.out.println("ArrayList write cost:"+(s6-s5));
long s7=System.currentTimeMillis();
for(int i=0;i<300000;i++)
{String s=(String)(alist.get(i));}
long s8=System.currentTimeMillis();
                  System.out.println("ArrayList read cost:"+(s8-s7));

//LinkedList
                  long s9=System.currentTimeMillis();
for(int i=0;i<300000;i++)
llist.add("haha");
long s10=System.currentTimeMillis();
System.out.println("LinkedList write cost:"+(s10-s9));
long s11=System.currentTimeMillis();
for(int i=0;i<300000;i++)
{String s=(String)(llist.get(i));}
long s12=System.currentTimeMillis();
                  System.out.println("LinkedList read cost:"+(s12-s11));
        
//Hashtable
                  long s13=System.currentTimeMillis();
                  for(int i=0;i<300000;i++)
{
 table.put(String.valueOf(i),"haha");
}
long s14=System.currentTimeMillis();
System.out.println("HashTable write cost:"+(s14-s13));
long s15=System.currentTimeMillis();
for(int i=0;i<300000;i++)
{String s=(String)(table.get(String.valueOf(i)));}
long s16=System.currentTimeMillis();
                  System.out.println("HashTable read cost:"+(s16-s15));
  
//HashMap      
                   long s17=System.currentTimeMillis();
                   for(int i=0;i<300000;i++)
{
 map.put(String.valueOf(i),"haha");
}
                  long s18=System.currentTimeMillis();
System.out.println("HashMap write cost:"+(s18-s17));
long s19=System.currentTimeMillis();
for(int i=0;i<300000;i++)
{String s=(String)(table.get(String.valueOf(i)));}
long s20=System.currentTimeMillis();
                  System.out.println("HashMap write cost:"+(s20-s19));

}}

解决方案 »

  1.   

    输出的结果:Vector write cost:94
    Vector read cost:16
    ArrayList write cost:140
    ArrayList read cost:16
    LinkedList write cost:203
    LinkedList read cost:746563
    HashTable write cost:1734
    HashTable read cost:343
    HashMap write cost:4407
    HashMap read cost:2984
      

  2.   

    这个结果有两点出乎了意料, Vector比ArrayList要快,Hashtable比HashMap要快,可能是这单线程的原因,但至少证明,如果像查询结果这些不用线程共享的数据,是存在Vector里面比ArrayList要好。 还有,不少人说,如果是连续的数据,不用中间插入或删除的,用LinkedList比用ArrayList要好,但实验发现,LinkedList的性能非常低。希望有人出现论讨一下原因。
      

  3.   

    Vector write cost:79
    Vector read cost:15
    ArrayList write cost:78
    ArrayList read cost:16
    LinkedList write cost:141
    LinkedList read cost:0
    HashTable write cost:750
    HashTable read cost:156
    HashMap write cost:812
    HashMap write cost:719
      

  4.   

    v 和 a差不多,单线程情况下另外你这样一次计算的结果并不能说明问题,多run几次你看看结果就知道了如果要客观的说明问题,应该run n次求平均耗时才具说服力
    LinkedListread太慢,我屏蔽了
      

  5.   

    TO kevinliuu: 我RUN了四次了,结果都是Vector比ArrayList要快,我想这是和CUP寄存器有关系。LinkedList读出消耗的时间, 比其它的长几十倍,实在应该避免使用。
      

  6.   


    class Hello {
      public static void main(String[] args) throws Exception {
        VectorWTest ls1 = new VectorWTest();
        ArrayListWTest ls2 = new ArrayListWTest();    Thread t1 = new Thread(ls1);
        Thread t2 = new Thread(ls2);
        t1.start();
        t2.start();
      }
    }
    class VectorWTest implements Runnable {
      public void run() {
        Vector v = new Vector(500000);
        long s1 = System.currentTimeMillis();
        for (int i = 0; i < 300000; i++)
          v.add("haha");
        long s2 = System.currentTimeMillis();
        System.out.println("Vector write cost:" + (s2 - s1));
        long s3 = System.currentTimeMillis();
        for (int i = 0; i < 300000; i++) {
          String s = (String) (v.get(i));
        }
        long s4 = System.currentTimeMillis();
        System.out.println("Vector read cost:" + (s4 - s3));
      }
    }class ArrayListWTest implements Runnable {
      public void run() {
        ArrayList alist = new ArrayList(500000);
        long s5 = System.currentTimeMillis();
        for (int i = 0; i < 300000; i++)
          alist.add("haha");
        long s6 = System.currentTimeMillis();
        System.out.println("ArrayList write cost:" + (s6 - s5));
        long s7 = System.currentTimeMillis();
        for (int i = 0; i < 300000; i++) {
          String s = (String) (alist.get(i));
        }
        long s8 = System.currentTimeMillis();
        System.out.println("ArrayList read cost:" + (s8 - s7));
      }
    }
      

  7.   

    谢谢楼上的测试代码,根据测试出来的结果,Vector跟ArrayList的效率,相差不是太多,ArrayList会快一点。
      

  8.   

    根本就不用测,Vector当然比ArrayList慢,Hashtable肯定比HashMap慢
    有的时候理论更重要
      

  9.   

    LinkedList大部分情况比ArrayList慢
    但是如果你从中间频繁的删除,LinkedList会比ArrayList快很多的
      

  10.   

    rw99yy的确是高手,几句概括非常好,请问一下,哪个collection类应该在哪种情况下跑才快,你不如给我们总结一下,好吧?
      

  11.   

    高手不是,我也是一样来探讨。具体各个集合实例的用法不是容易说清的。只有在实践中体会,我可以给几个连接倒是可以去看看!
    《think in java 》 第8章 对象的容纳 有介绍
     http://lizzie0510.blogchina.com/261252.html(我临时随便找了下)
     http://book.chinaz.com/JAVA/javalx/8-1.gif(这个不错)
     另外:jdk文档是个不错的选择。
      

  12.   

    Vector以后不要再用了,用ArrayList代替。
    ArrayList适用于随机存取;
    LinkedArrayList适用于随机存取,尤其是大量的add/delete时。
    HashTable与HashMap相比,HashTable要慢一些,因为它是同步的,而HashMap不同步,在没有同步要求情况下用HashMap代替HashTable。