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

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

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

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

                  }

                  
          else
                  
          {
                      System.out.println(
          "沒實(shí)現(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);
              }

          }

          補(bǔ)充:(2007年4月23日)
          下面的程序用來測試ArrayList和LinkedList遍歷方式的不同對性能(執(zhí)行時(shí)間)的影響。
          
          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(
          "請輸入元素的個(gè)數(shù)和遍歷次數(shù)!");
                      
          return;
                  }
                  
          int number = Integer.parseInt(args[0]);// 集合中元素的個(gè)數(shù)
                  int count = Integer.parseInt(args[1]);// 遍歷集合中元素的次數(shù)

                  List list 
          = new ArrayList();
                  addObject(list, number);
          //向集合中添加number個(gè)元素
                  System.out.println("遍歷ArrayList:");
                  travelwithoutIterator(list, count);
          //不用迭代器遍歷
                  travelwithIterator(list, count);//用迭代器遍歷
                  list = new LinkedList();
                  addObject(list, number);
          //向集合中添加number個(gè)元素
                  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(
          "不使用迭代器的間隔時(shí)間:" + 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(
          "使用迭代器的間隔時(shí)間:" + interval);
              }

              
          public static void travel(List list, int count)
              {
                  
          long startTime;
                  
          long endTime;
                  
          if (list instanceof RandomAccess)
                  {
                      System.out.println(
          "實(shí)現(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(
          "間隔時(shí)間:" + interval);
                  } 
          else
                  {
                      System.out.println(
          "沒實(shí)現(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(
          "間隔時(shí)間:" + interval);
                  }
              }
          }

          我在命令行輸入:java TestDifferent 100 10000
          輸出結(jié)果是:
          遍歷ArrayList:
          不使用迭代器的間隔時(shí)間:31
          使用迭代器的間隔時(shí)間:63
          遍歷LinkedList:
          不使用迭代器的間隔時(shí)間:93
          使用迭代器的間隔時(shí)間:32
          以上結(jié)果隨著JVM的運(yùn)行環(huán)境而變化。
          當(dāng)元素個(gè)數(shù)>100并且遍歷次數(shù)大于10000次時(shí)效果明顯。


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

          評論

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

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

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

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

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

          謝謝上面朋友的建議,我補(bǔ)充了一個(gè)測試性能的程序,請大家驗(yàn)收。  回復(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)計(jì)

          常用鏈接

          留言簿(11)

          隨筆分類(48)

          文章分類(29)

          常去逛逛

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 图片| 封开县| 肥东县| 云梦县| 徐州市| 青海省| 嫩江县| 元朗区| 涟水县| 马鞍山市| 鹤山市| 营山县| 苏尼特左旗| 同心县| 伊宁县| 宁陕县| 普安县| 三亚市| 堆龙德庆县| 浦城县| 武乡县| 兴海县| 嘉黎县| 辰溪县| 大同市| 雷波县| 辽宁省| 清镇市| 饶阳县| 井冈山市| 昌都县| 调兵山市| 广州市| 营口市| 巢湖市| 贺州市| 深水埗区| 大城县| 抚宁县| 阜城县| 枣强县|