RandomAccess接口作用

RandomAccess接口:这是一个标记接口,如果List子类实现了RandomAccess接口,那就表示它能够快速随机访问存储的元素。在对列表进行随机或顺序访问的时候,访问算法能够选择性能最佳方式。

        /**
         * 初始化 list,添加n个元素
         * 
         * @param list
         * @return
         */
        public static <T> List initList(List list, int n) {
            for (int i = 0; i < n; i++)
                list.add(i);
            return list;
        }
        
        /**
         * 遍历 list,判断是否实现 RandomAccess 接口来使用不同的遍历方法
         * 
         * @param list
         */
        public static void accessList(List list) {
            long startTime = System.currentTimeMillis();
            
            if (list instanceof RandomAccess) {
                System.out.println("实现了 RandomAccess 接口...");
                for (int i = 0; i < list.size(); i++) {
                    list.get(i);
                }
            } else {
                System.out.println("没实现 RandomAccess 接口...");
                for (Iterator iterator = list.iterator(); iterator.hasNext();) {
                    iterator.next();
                }
            }
            
            long endTime = System.currentTimeMillis();
            System.out.println("遍历时间:" + (endTime - startTime));
        }
        
        /**
         * loop 遍历 list
         */
        public static void accessListByLoop(List list) {
            long startTime = System.currentTimeMillis();
            
            for (int i = 0; i < list.size(); i++) {
                list.get(i);
            }
            
            long endTime = System.currentTimeMillis();
            System.out.println("loop遍历时间:" + (endTime - startTime));
        }

       /**
         * forEach 遍历 list
         */
        public static void accessListByForEach(List list) {
            long startTime = System.currentTimeMillis();
            
            for (Object obj : list) {
                
            }
            
            long endTime = System.currentTimeMillis();
            System.out.println("forEach遍历时间:" + (endTime - startTime));
        }

        /**
         * 迭代器遍历
         */
        public static void accessListByIterator(List list) {
            long startTime = System.currentTimeMillis();
            
            for (Iterator iterator = list.iterator(); iterator.hasNext();) {
                iterator.next();
            }
            
            long endTime = System.currentTimeMillis();
            System.out.println("Iterator遍历时间:" + (endTime - startTime));
        }

    @Test
    public void testRandomAccess(){
        ArrayList<Integer> aList = (ArrayList<Integer>) initList(new ArrayList<>(), 50000);
        LinkedList<Integer> lList = (LinkedList<Integer>) initList(new LinkedList<>(), 50000);
        
        accessList(aList);
        accessList(lList);
        
        System.out.println("ArrayList");
        accessListByLoop(aList);
        accessListByForEach(aList);
        accessListByIterator(aList);
        
        System.out.println("LinkedList");
        accessListByLoop(lList);
        accessListByForEach(lList);
        accessListByIterator(lList);
   
    }

执行结果

  1. 使用ArrayList遍历时将list大小改为2000000执行结果如下:

实现了 RandomAccess 接口...
遍历时间:13
没实现 RandomAccess 接口...
遍历时间:38
ArrayList
loop遍历时间:13
forEach遍历时间:19
Iterator遍历时间:20

  1. 使用LinkedList遍历时将list大小改为50000执行结果如下:

实现了 RandomAccess 接口...
遍历时间:11
没实现 RandomAccess 接口...
遍历时间:17
LinkedList
loop遍历时间:6134
forEach遍历时间:16
Iterator遍历时间:16

结论:明显可以看出在遍历ArrayList时for循环的效率最高,而在遍历LinkList时for循环的效率要远远最低;原因就是ArrayList实现了RandomAccess接口,拥有快速随机访问存储的元素的功能,而LinkList则没有此功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java源码研究之容器(1) 如何看源码 很多时候我们看源码, 看完了以后经常也没啥收获, 有些地方看得懂, 有些...
    骆驼骑士阅读 1,009评论 0 22
  • Collection接口 Collection接口是所有集合的祖先类。他有两个构造方法,一个无参构造,一个是带Co...
    夜幕繁华阅读 613评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 一.线性表 定义:零个或者多个元素的有限序列。也就是说它得满足以下几个条件:  ①该序列的数据元素是有限的。  ②...
    Geeks_Liu阅读 2,714评论 1 12
  • 悲伤可以减肥的话 那我一定是个瘦子。
    花咩SWAG阅读 150评论 0 0