關于RandomAccess接口的研究

          RandomAccess接口是List 實現所使用的標記接口,用來表明其支持快速(通常是固定時間)隨機訪問。此接口的主要目的是允許一般的算法更改其行為,從而在將其應用到隨機或連續訪問列表時能提供良好的性能。

          在對List特別的遍歷算法中,要盡量來判斷是屬于RandomAccess(如ArrayList)還是SequenceAccess(如LinkedList),因為適合RandomAccess List的遍歷算法,用在SequenceAccess List上就差別很大,即對于實現了RandomAccess接口的類實例而言,此循環

               for (int i=0, i<list.size(); i++)
          list.get(i);
          
          的運行速度要快于以下循環:
               for (Iterator i=list.iterator(); i.hasNext(); )
          i.next();
          通過下面的代碼,大家可以加深理解。
          
          /*
          *@author 我為J狂 建立日期 2007-4-22
          *
          */

          package com.bokee.lzqdiy;

          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.LinkedList;
          import java.util.List;
          import java.util.RandomAccess;

          public class Travel{

              
          /**
               * 
          @param args
               
          */

              
          public static void travel(List list)
              
          {
                  
          if (list instanceof RandomAccess)
                  
          {
                      System.out.println(
          "實現了RandomAccess接口,不使用迭代器!");
                      
          for(int i=0;i<list.size();i++)
                      
          {
                          System.out.println(list.get(i));
                      }

                  }

                  
          else
                  
          {
                      System.out.println(
          "沒實現RandomAccess接口,使用迭代器!");
                      
          for (Iterator iter = list.iterator(); iter.hasNext();)
                      
          {
                          System.out.println((String) iter.next());
                      }

                  }

              }

              
          public static void main(String[] args)
              
          {
                  List list
          =new ArrayList();
                  list.add(
          "a");
                  list.add(
          "b");
                  travel(list);
                  list
          =new LinkedList(); 
                  list.add(
          "c");
                  list.add(
          "d");
                  travel(list);
              }

          }

          補充:(2007年4月23日)
          下面的程序用來測試ArrayList和LinkedList遍歷方式的不同對性能(執行時間)的影響。
          
          package net.blogjava.lzqdiy;

          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.LinkedList;
          import java.util.List;
          import java.util.RandomAccess;

          public class TestDifferent
          {

              
          public static void main(String[] args)
              {
                  
          if (args.length == 0)
                  {
                      System.err.println(
          "請輸入元素的個數和遍歷次數!");
                      
          return;
                  }
                  
          int number = Integer.parseInt(args[0]);// 集合中元素的個數
                  int count = Integer.parseInt(args[1]);// 遍歷集合中元素的次數

                  List list 
          = new ArrayList();
                  addObject(list, number);
          //向集合中添加number個元素
                  System.out.println("遍歷ArrayList:");
                  travelwithoutIterator(list, count);
          //不用迭代器遍歷
                  travelwithIterator(list, count);//用迭代器遍歷
                  list = new LinkedList();
                  addObject(list, number);
          //向集合中添加number個元素
                  System.out.println("遍歷LinkedList:");
                  travelwithoutIterator(list, count);
          //不用迭代器遍歷
                  travelwithIterator(list, count);//用迭代器遍歷
              }

              
          /** */
              
          /**
               * *
               * 
               * 
          @param args
               
          */
              
          public static void addObject(List list, int n)
              {
                  
          for (int m = 1; m <= n; m++)
                  {
                      list.add(
          "" + m);
                  }
              }

              
          public static void travelwithoutIterator(List list, int count)
              {
                  
          long startTime;
                  
          long endTime;
                  startTime 
          = System.currentTimeMillis();
                  
          for (int a = 1; a <= count; a++)
                  {
                      
          for (int i = 0; i < list.size(); i++)
                      {
                          list.get(i);
                      }
                  }
                  endTime 
          = System.currentTimeMillis();
                  
          long interval = endTime - startTime;
                  System.out.println(
          "不使用迭代器的間隔時間:" + interval);
              }

              
          public static void travelwithIterator(List list, int count)
              {
                  
          long startTime;
                  
          long endTime;
                  startTime 
          = System.currentTimeMillis();
                  
          for (int a = 1; a <= count; a++)
                  {
                      
          for (Iterator iter = list.iterator(); iter.hasNext();)
                      {
                          iter.next();
                      }
                  }
                  endTime 
          = System.currentTimeMillis();
                  
          long interval = endTime - startTime;
                  System.out.println(
          "使用迭代器的間隔時間:" + interval);
              }

              
          public static void travel(List list, int count)
              {
                  
          long startTime;
                  
          long endTime;
                  
          if (list instanceof RandomAccess)
                  {
                      System.out.println(
          "實現了RandomAccess接口,不使用迭代器!");
                      startTime 
          = System.currentTimeMillis();
                      
          for (int a = 1; a <= count; a++)
                      {
                          
          for (int i = 0; i < list.size(); i++)
                          {
                              list.get(i);
                          }
                      }
                      endTime 
          = System.currentTimeMillis();
                      
          long interval = endTime - startTime;
                      System.out.println(
          "間隔時間:" + interval);
                  } 
          else
                  {
                      System.out.println(
          "沒實現RandomAccess接口,使用迭代器!");
                      startTime 
          = System.currentTimeMillis();
                      
          for (int a = 1; a <= count; a++)
                      {
                          
          for (Iterator iter = list.iterator(); iter.hasNext();)
                          {
                              iter.next();
                          }
                      }
                      endTime 
          = System.currentTimeMillis();
                      
          long interval = endTime - startTime;
                      System.out.println(
          "間隔時間:" + interval);
                  }
              }
          }

          我在命令行輸入:java TestDifferent 100 10000
          輸出結果是:
          遍歷ArrayList:
          不使用迭代器的間隔時間:31
          使用迭代器的間隔時間:63
          遍歷LinkedList:
          不使用迭代器的間隔時間:93
          使用迭代器的間隔時間:32
          以上結果隨著JVM的運行環境而變化。
          當元素個數>100并且遍歷次數大于10000次時效果明顯。


          posted on 2007-04-22 11:29 我為J狂 閱讀(4352) 評論(4)  編輯  收藏 所屬分類: Java算法

          評論

          # re: 關于RandomAccess接口的研究 2007-04-22 20:41 cuichang

          我認為你要想說明問題,應該用一些實際的數據說明問題,這樣寫代碼,看不出什么來的啊
          循環1000跳數據試一下不就 知道了嗎  回復  更多評論   

          # re: 關于RandomAccess接口的研究 2007-04-23 01:00 小飛鳥

          確實啊 同意樓上同志的看法 循環1000次看看性能  回復  更多評論   

          # re: 關于RandomAccess接口的研究 2007-04-23 11:07 我為J狂

          謝謝上面朋友的建議,我補充了一個測試性能的程序,請大家驗收。  回復  更多評論   

          # re: 關于RandomAccess接口的研究 2007-05-08 15:45 劉娟

          構精確的!!!  回復  更多評論   

          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(11)

          隨筆分類(48)

          文章分類(29)

          常去逛逛

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 蒲城县| 赤水市| 新营市| 玛曲县| 马鞍山市| 韩城市| 陕西省| 邓州市| 班玛县| 澎湖县| 灵寿县| 扶风县| 来宾市| 铜梁县| 资阳市| 樟树市| 馆陶县| 汕头市| 喀喇| 明溪县| 巫山县| 时尚| 贵州省| 昌平区| 惠州市| 榆林市| 吕梁市| 平和县| 宜城市| 会东县| 湘西| 古浪县| 仲巴县| 资源县| 靖边县| 韩城市| 惠州市| 闽侯县| 平定县| 眉山市| 琼海市|