<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    關于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狂 閱讀(4351) 評論(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)

    常去逛逛

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产免费黄色大片| 国语成本人片免费av无码| 亚洲国产成人久久综合一区77| 亚洲乱亚洲乱妇24p| 日本无吗免费一二区| 亚洲AV无码一区二区一二区| 在线看片无码永久免费aⅴ| 亚洲第一综合天堂另类专| 国产成人精品男人免费| 精品国产亚洲第一区二区三区| 男人的天堂亚洲一区二区三区 | 2021在线观看视频精品免费| 亚洲最大在线观看| 无码视频免费一区二三区| 亚洲18在线天美| 日本免费人成黄页网观看视频| 美女扒开屁股让男人桶爽免费| 亚洲不卡AV影片在线播放| a级片免费在线播放| 亚洲视频在线一区二区三区| 亚洲免费网站观看视频| 一本久久免费视频| 亚洲av不卡一区二区三区| 2020久久精品国产免费| 国产精品亚洲一区二区三区久久| 亚洲男人av香蕉爽爽爽爽| 日本在线免费播放| 亚洲最大中文字幕无码网站| 国产v片免费播放| 成人免费区一区二区三区 | 亚洲国产成a人v在线| 日本牲交大片免费观看| 99在线视频免费观看| 亚洲免费视频网址| 免费一级做a爰片性色毛片| 黄色片免费在线观看| 亚洲精品国产综合久久久久紧| 亚洲欧洲国产精品香蕉网| 成熟女人牲交片免费观看视频 | 国产精品免费福利久久| 亚洲日本久久久午夜精品|