關(guān)于RandomAccess接口的研究

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

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

               for (int i=0, i<list.size(); i++)
          list.get(i);
          
          的運行速度要快于以下循環(huán):
               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(
          "實現(xiàn)了RandomAccess接口,不使用迭代器!");
                      
          for(int i=0;i<list.size();i++)
                      
          {
                          System.out.println(list.get(i));
                      }

                  }

                  
          else
                  
          {
                      System.out.println(
          "沒實現(xiàn)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遍歷方式的不同對性能(執(zhí)行時間)的影響。
          
          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(
          "請輸入元素的個數(shù)和遍歷次數(shù)!");
                      
          return;
                  }
                  
          int number = Integer.parseInt(args[0]);// 集合中元素的個數(shù)
                  int count = Integer.parseInt(args[1]);// 遍歷集合中元素的次數(shù)

                  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(
          "實現(xiàn)了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(
          "沒實現(xiàn)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
          輸出結(jié)果是:
          遍歷ArrayList:
          不使用迭代器的間隔時間:31
          使用迭代器的間隔時間:63
          遍歷LinkedList:
          不使用迭代器的間隔時間:93
          使用迭代器的間隔時間:32
          以上結(jié)果隨著JVM的運行環(huán)境而變化。
          當元素個數(shù)>100并且遍歷次數(shù)大于10000次時效果明顯。


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

          評論

          # re: 關(guān)于RandomAccess接口的研究 2007-04-22 20:41 cuichang

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

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

          確實啊 同意樓上同志的看法 循環(huán)1000次看看性能  回復(fù)  更多評論   

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

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

          # re: 關(guān)于RandomAccess接口的研究 2007-05-08 15:45 劉娟

          構(gòu)精確的!!!  回復(fù)  更多評論   

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

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(11)

          隨筆分類(48)

          文章分類(29)

          常去逛逛

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 杭锦旗| 平凉市| 吐鲁番市| 盐边县| 石景山区| 鸡西市| 新余市| 武汉市| 庆云县| 金坛市| 闻喜县| 海城市| 巴林左旗| 安西县| 兴山县| 都安| 始兴县| 翁牛特旗| 惠水县| 沁水县| 南宁市| 东光县| 铅山县| 浦北县| 裕民县| 图片| 永康市| 开封市| 临夏市| 庆城县| 玉屏| 额敏县| 景泰县| 宝山区| 洪泽县| 泉州市| 扎兰屯市| 襄垣县| 安塞县| 齐河县| 无极县|