zoukankan      html  css  js  c++  java
  • 关于接口 RandomAccess

    今天看到java.util.Collections这个工具类中的

     public 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);
                }
            }
        }


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

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

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

    测试代码:

    package com.zslin.list.demo;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.RandomAccess;
    
    
    
    //JDK中说的很清楚,在对List特别是Huge size的List的遍历算法中,
    //    要尽量来判断是属于RandomAccess(如ArrayList)还是Sequence List (如LinkedList),
    //    因为适合RandomAccess List的遍历算法,用在Sequence List上就差别很大,常用的作法就是:
    //    要作一个判断:
    //    if (list instance of RandomAccess) {
    //        for(int m = 0; m < list.size(); m++){}
    //    }else{
    //        Iterator iter = list.iterator();
    //        while(iter.hasNext()){}
    //    }
    
    
    
    
    
    
    /**
     * 
     * @author WQ<br>
     * @version 创建时间:2017年6月18日 下午6:01:14<br>
     */
    public class TestRandomAccess {
        // 初始化列表
    
        public static void initList(List list, int n) {
            for (int i = 0; i < n; i++) {
                list.add(i);
            }
        }
    
        // 使用循环进行对列表的迭代
    
        public static void traverseWithLoop(List list) {
            long starttime = 0;
            long endtime = 0;
            starttime = System.currentTimeMillis();
            for (int count = 0; count <= 1000; count++) {
                for (int i = 0; i < list.size(); i++) {
                    list.get(i);
                }
            }
            endtime = System.currentTimeMillis();
            System.out.println("使用loop迭代一共花了" + (endtime - starttime) + "ms时间");
    
        }
    
        // 使用迭代器对列表进行迭代
    
        public static void traverseWithIterator(List list) {
            long starttime = 0;
            long endtime = 0;
            starttime = System.currentTimeMillis();
            for (int count = 0; count <= 1000; count++) {
                for (Iterator itr = list.iterator(); itr.hasNext();) {
                    itr.next();
                }
            }
            endtime = System.currentTimeMillis();
            System.out.println("使用Iterator迭代一共花了" + (endtime - starttime) + "ms时间");
        }
    
        public static void traverse(List list) {
    
            long starttime = 0;
            long endtime = 0;
            if (list instanceof RandomAccess) {
                System.out.println("该list实现了RandomAccess接口");
                starttime = System.currentTimeMillis();
                for (int count = 0; count <= 1000; count++) {
                    for (int i = 0; i < list.size(); i++) {
                        list.get(i);
                    }
                }
                endtime = System.currentTimeMillis();
                System.out.println("迭代一共花了" + (endtime - starttime) + "ms时间");
            } else {
                System.out.println("该list未实现RandomAccess接口");
                starttime = System.currentTimeMillis();
                for (int count = 0; count <= 1000; count++) {
                    for (Iterator itr = list.iterator(); itr.hasNext();) {
                        itr.next();
                    }
                }
                endtime = System.currentTimeMillis();
                System.out.println("迭代一共花了" + (endtime - starttime) + "ms时间");
            }
        }
    
        public static void main(String[] args) {
            ArrayList arraylist = new ArrayList();
            LinkedList linkedlist = new LinkedList();
            initList(arraylist, 1000);
            initList(linkedlist, 1000);
            traverse(arraylist);
            traverse(linkedlist);
            traverseWithIterator(arraylist);
            traverseWithLoop(arraylist);
            traverseWithIterator(linkedlist);
            traverseWithLoop(linkedlist);
        }
    }

    运行结果如下:

    该list实现了RandomAccess接口
    迭代一共花了9ms时间
    该list未实现RandomAccess接口
    迭代一共花了10ms时间
    使用Iterator迭代一共花了12ms时间
    使用loop迭代一共花了7ms时间
    使用Iterator迭代一共花了14ms时间
    使用loop迭代一共花了396ms时间

    以上。

  • 相关阅读:
    java中Condition类的详细介绍(详解)
    Semaphore原理以及使用总结
    RocketMQ消息存储原理总结(一)
    Es Bucket聚合(桶聚合)总结
    "元素隐式具有 “any” 类型,因为类型“Shared”没有索引签名"问题解决思路
    有关生产环境tomcat java应用报错Caused by: java.lang.OutOfMemoryError: Java heap space的调研
    docker 实践02
    正睿比赛总结day1
    【水】一个神秘玩意:如何分辨出差别很小的颜色?
    AtCoder Regular Contest 125 比赛记录(vp)
  • 原文地址:https://www.cnblogs.com/mr-wuxiansheng/p/7044899.html
Copyright © 2011-2022 走看看