当前位置:首页 > 操作系统 > MacOs

关于接口 RandomAccess

static <T> void fill(List<? super T> list, T obj) { int size = list.size(); if (size < FILL_THRESHOLD || list instanceof RandomAccess) { // 这一行 for (int i=0; i<size; i++) list.set(i, obj); } else { ListIterator<? super T> itr = list.listIterator(); for (int i=0; i<size; i++) { itr.next(); itr.set(obj); } } }
<code><br><br></code>

上面代码中标识的一行, FILL_THRESHOLD 是25,就是说,如果要填充的目标List范围不是很大,那么就直接用上面的方式效率比较高,同时注意到   list instanceof RamdomAccess 这个代码,顺便翻到里面去瞅了一眼,RamdomAccess 接口是一个空接口,空接口的作用一般起到一个标识作用,比如:Serializable 接口。

RaomdomAccess接口里面的文档说明大致意思:给可以提供随机访问的List实现去标识一下,这样使用这个List的程序在遍历这种类型的List的时候可以有更高效率。仅此而已。

所以,我们在遍历List之前,可以用  if( list instanceof RamdomAccess ) 来标识一下,选择用哪种遍历方式。

 

 

测试代码:

<span style="color: #0000ff">package</span><span style="color: #000000"> com.zslin.list.demo;

</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.ArrayList;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Iterator;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.LinkedList;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.List;
</span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.RandomAccess;



</span><span style="color: #008000">//</span><span style="color: #008000">JDK中说的很清楚,在对List特别是Huge size的List的遍历算法中,
</span><span style="color: #008000">//</span><span style="color: #008000">    要尽量来判断是属于RandomAccess(如ArrayList)还是Sequence List (如LinkedList),
</span><span style="color: #008000">//</span><span style="color: #008000">    因为适合RandomAccess List的遍历算法,用在Sequence List上就差别很大,常用的作法就是:
</span><span style="color: #008000">//</span><span style="color: #008000">    要作一个判断:
</span><span style="color: #008000">//</span><span style="color: #008000">    if (list instance of RandomAccess) {
</span><span style="color: #008000">//</span><span style="color: #008000">        for(int m = 0; m < list.size(); m++){}
</span><span style="color: #008000">//</span><span style="color: #008000">    }else{
</span><span style="color: #008000">//</span><span style="color: #008000">        Iterator iter = list.iterator();
</span><span style="color: #008000">//</span><span style="color: #008000">        while(iter.hasNext()){}
</span><span style="color: #008000">//</span><span style="color: #008000">    }</span>






<span style="color: #008000">/**</span><span style="color: #008000">
 * 
 * </span><span style="color: #808080">@author</span><span style="color: #008000"> WQ<br>
 * </span><span style="color: #808080">@version</span><span style="color: #008000"> 创建时间:2017年6月18日 下午6:01:14<br>
 </span><span style="color: #008000">*/</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span><span style="color: #000000"> TestRandomAccess {
    </span><span style="color: #008000">//</span><span style="color: #008000"> 初始化列表</span>

    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> initList(List list, <span style="color: #0000ff">int</span><span style="color: #000000"> n) {
        </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i < n; i++<span style="color: #000000">) {
            list.add(i);
        }
    }

    </span><span style="color: #008000">//</span><span style="color: #008000"> 使用循环进行对列表的迭代</span>

    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> traverseWithLoop(List list) {
        </span><span style="color: #0000ff">long</span> starttime = 0<span style="color: #000000">;
        </span><span style="color: #0000ff">long</span> endtime = 0<span style="color: #000000">;
        starttime </span>=<span style="color: #000000"> System.currentTimeMillis();
        </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> count = 0; count <= 1000; count++<span style="color: #000000">) {
            </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i < list.size(); i++<span style="color: #000000">) {
                list.get(i);
            }
        }
        endtime </span>=<span style="color: #000000"> System.currentTimeMillis();
        System.out.println(</span>"使用loop迭代一共花了" + (endtime - starttime) + "ms时间"<span style="color: #000000">);

    }

    </span><span style="color: #008000">//</span><span style="color: #008000"> 使用迭代器对列表进行迭代</span>

    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> traverseWithIterator(List list) {
        </span><span style="color: #0000ff">long</span> starttime = 0<span style="color: #000000">;
        </span><span style="color: #0000ff">long</span> endtime = 0<span style="color: #000000">;
        starttime </span>=<span style="color: #000000"> System.currentTimeMillis();
        </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> count = 0; count <= 1000; count++<span style="color: #000000">) {
            </span><span style="color: #0000ff">for</span> (Iterator itr =<span style="color: #000000"> list.iterator(); itr.hasNext();) {
                itr.next();
            }
        }
        endtime </span>=<span style="color: #000000"> System.currentTimeMillis();
        System.out.println(</span>"使用Iterator迭代一共花了" + (endtime - starttime) + "ms时间"<span style="color: #000000">);
    }

    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> traverse(List list) {

        </span><span style="color: #0000ff">long</span> starttime = 0<span style="color: #000000">;
        </span><span style="color: #0000ff">long</span> endtime = 0<span style="color: #000000">;
        </span><span style="color: #0000ff">if</span> (list <span style="color: #0000ff">instanceof</span><span style="color: #000000"> RandomAccess) {
            System.out.println(</span>"该list实现了RandomAccess接口"<span style="color: #000000">);
            starttime </span>=<span style="color: #000000"> System.currentTimeMillis();
            </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> count = 0; count <= 1000; count++<span style="color: #000000">) {
                </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> i = 0; i < list.size(); i++<span style="color: #000000">) {
                    list.get(i);
                }
            }
            endtime </span>=<span style="color: #000000"> System.currentTimeMillis();
            System.out.println(</span>"迭代一共花了" + (endtime - starttime) + "ms时间"<span style="color: #000000">);
        } </span><span style="color: #0000ff">else</span><span style="color: #000000"> {
            System.out.println(</span>"该list未实现RandomAccess接口"<span style="color: #000000">);
            starttime </span>=<span style="color: #000000"> System.currentTimeMillis();
            </span><span style="color: #0000ff">for</span> (<span style="color: #0000ff">int</span> count = 0; count <= 1000; count++<span style="color: #000000">) {
                </span><span style="color: #0000ff">for</span> (Iterator itr =<span style="color: #000000"> list.iterator(); itr.hasNext();) {
                    itr.next();
                }
            }
            endtime </span>=<span style="color: #000000"> System.currentTimeMillis();
            System.out.println(</span>"迭代一共花了" + (endtime - starttime) + "ms时间"<span style="color: #000000">);
        }
    }

    </span><span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) {
        ArrayList arraylist </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> ArrayList();
        LinkedList linkedlist </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> LinkedList();
        initList(arraylist, </span>1000<span style="color: #000000">);
        initList(linkedlist, </span>1000<span style="color: #000000">);
        traverse(arraylist);
        traverse(linkedlist);
        traverseWithIterator(arraylist);
        traverseWithLoop(arraylist);
        traverseWithIterator(linkedlist);
        traverseWithLoop(linkedlist);
    }
}</span>

 

运行结果如下:

<span style="color: #000000">该list实现了RandomAccess接口
迭代一共花了9ms时间
该list未实现RandomAccess接口
迭代一共花了10ms时间
使用Iterator迭代一共花了12ms时间
使用loop迭代一共花了7ms时间
使用Iterator迭代一共花了14ms时间
使用loop迭代一共花了396ms时间</span>

 

 

 

以上。

 

关于接口 RandomAccess

标签:count   string   print   tor   作用   set   mil   util   ram   

本文系统来源:http://www.cnblogs.com/mr-wuxiansheng/p/7044899.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐