<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)

    常去逛逛

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久国产精品免费视频| 中文字幕在线观看免费视频 | 免费a级毛片18以上观看精品| 亚洲国产精品网站久久| 最近免费视频中文字幕大全| 久久精品国产亚洲AV无码娇色 | a毛片久久免费观看| 亚洲精品亚洲人成在线观看| 中文字幕不卡高清免费| 亚洲AV永久青草无码精品| 男人j进入女人j内部免费网站| 亚洲小视频在线观看| 蜜臀AV免费一区二区三区| 亚洲AV无码成人专区| 国产麻豆免费观看91| 人人鲁免费播放视频人人香蕉| 亚洲日产韩国一二三四区| 一级毛片免费视频| 亚洲人成网网址在线看| 精品无码国产污污污免费| 免费无码专区毛片高潮喷水| 最新国产AV无码专区亚洲| 最好看最新的中文字幕免费| 久久夜色精品国产噜噜亚洲a| 在线观看免费亚洲| 99久久99这里只有免费的精品 | 香蕉蕉亚亚洲aav综合| 无码专区永久免费AV网站| 高h视频在线免费观看| 亚洲Av无码精品色午夜| 国产精品成人免费一区二区| 色老头综合免费视频| 自怕偷自怕亚洲精品| 日本不卡高清中文字幕免费| 国产精品免费观看视频| 亚洲一级高清在线中文字幕| 亚洲AV网站在线观看| 男人j进入女人j内部免费网站| 亚洲熟伦熟女专区hd高清| 亚洲精品成人片在线观看精品字幕 | 亚洲AⅤ优女AV综合久久久|