首页 > 编程语言 >java RandomAccess 遍历效率

java RandomAccess 遍历效率

时间:2023-04-20 18:09:27浏览次数:51  
标签:遍历 java Iterator 迭代 List list import RandomAccess


 RandomAccess 是判断集合是否支持快速随即访问,以下是个测试用例:

JDK中推荐的是对List集合尽量要实现RandomAccess接口

如果集合类是RandomAccess的实现,则尽量用for(int i = 0; i < size; i++) 来遍历而不要用Iterator迭代器来遍历,在效率上要差一些。反过来,如果List是Sequence List,则最好用迭代器来进行迭代。

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()){}
    }

验证:

Java代码   

java RandomAccess 遍历效率_迭代

    1. <span style="font-size: small;">/*
    2.  * To change this template, choose Tools | Templates
    3.  * and open the template in the editor.
    4.  */
    5. package
    6.   
    7. import
    8. import
    9. import
    10. import
    11. import
    12.   
    13. /**
    14.  *
    15.  * @author bolong
    16.  */
    17. public class
    18. // 初始化列表
    19.   
    20. public static void initList(List list, int
    21. for (int i = 0; i < n; i++) {  
    22.             list.add(i);  
    23.         }  
    24.     }  
    25. //使用循环进行对列表的迭代
    26.   
    27. public static void
    28. long starttime = 0;  
    29. long endtime = 0;  
    30.         starttime = System.currentTimeMillis();  
    31. for (int count = 0; count <= 1000; count++) {  
    32. for (int i = 0; i < list.size(); i++) {  
    33.                 list.get(i);  
    34.             }  
    35.         }  
    36.         endtime = System.currentTimeMillis();  
    37. "使用loop迭代一共花了" + (endtime - starttime) + "ms时间");  
    38.   
    39.     }  
    40. //使用迭代器对列表进行迭代
    41.   
    42. public static void
    43. long starttime = 0;  
    44. long endtime = 0;  
    45.         starttime = System.currentTimeMillis();  
    46. for (int count = 0; count <= 1000; count++) {  
    47. for
    48.                 itr.next();  
    49.             }  
    50.         }  
    51.         endtime = System.currentTimeMillis();  
    52. "使用Iterator迭代一共花了" + (endtime - starttime) + "ms时间");  
    53.     }  
    54.   
    55. public static void
    56.   
    57. long starttime = 0;  
    58. long endtime = 0;  
    59. if (list instanceof
    60. "该list实现了RandomAccess接口");  
    61.             starttime = System.currentTimeMillis();  
    62. for (int count = 0; count <= 1000; count++) {  
    63. for (int i = 0; i < list.size(); i++) {  
    64.                     list.get(i);  
    65.                 }  
    66.             }  
    67.             endtime = System.currentTimeMillis();  
    68. "迭代一共花了" + (endtime - starttime) + "ms时间");  
    69. else
    70. "该list未实现RandomAccess接口");  
    71.             starttime = System.currentTimeMillis();  
    72. for (int count = 0; count <= 1000; count++) {  
    73. for
    74.                     itr.next();  
    75.                 }  
    76.             }  
    77.             endtime = System.currentTimeMillis();  
    78. "迭代一共花了" + (endtime - starttime) + "ms时间");  
    79.         }  
    80.     }  
    81.   
    82. public static void
    83. new
    84. new
    85. 1000);  
    86. 1000);  
    87.         traverse(arraylist);  
    88.         traverse(linkedlist);  
    89.         traverseWithIterator(arraylist);  
    90.         traverseWithLoop(arraylist);  
    91.         traverseWithIterator(linkedlist);  
    92.         traverseWithLoop(linkedlist);  
    93.     }  
    94. }  
    95. </span>

     运行程序输出的结果为:

    该list实现了RandomAccess接口
    迭代一共花了47ms时间
    该list未实现RandomAccess接口
    迭代一共花了15ms时间
    使用Iterator迭代一共花了79ms时间
    使用loop迭代一共花了46ms时间
    使用Iterator迭代一共花了47ms时间
    使用loop迭代一共花了797ms时间

    结论:

    根据程序输出的结果的确证明了,arraylist等实现了RandomAccessj接口的类在进行迭代时使用loop效率更高,而linkedList那些未实现该接口的类在进行迭代时使用Iterator进行迭代效率更高.

    标签:遍历,java,Iterator,迭代,List,list,import,RandomAccess
    From: https://blog.51cto.com/u_2465818/6210084

    相关文章

    • 15 个必须知道的 Java 面试问题(2年工作经验)
      【Java核心】1)Whatisthepurposeofserialization?2)WhatisthedifferencebetweenJDKandJRE?3)Whatisthedifferencebetweenequalsand==?4)WhenwillyouuseComparatorandComparableinterfaces?5)Whatisthewait/notifymechanism?6)......
    • java CountDownLatch 实例
      一个线程等待CountDownLatch使用其await()等待其他线程完成(使用减值为0来判断是否完成)。是一个线程等待多个线程(1-N)的锁工具。以下为实例代码: packagecom.common;importjava.util.concurrent.CountDownLatch;importjava.util.concurrent.Executor;importjava.util.concurr......
    • 关于Java中对象的向上转型和向下转型
      什么是多态?同一个类调用同一个方法会产生不同的影响/结果这就是多态publicclassPet{ publicvoideat(){ System.out.println("Peteat...") }}classDogextendsPet{ publicvoideat(){ System.out.pringln("Dogeat...") } publicvoidrun(){ System.ou......
    • day 07 7.1 前端基础之JavaScript基础【一】
      前端基础之JavaScript基础【一】【1】、JavaScript的历史1992年底,美国国家超级电脑应用中心(NCSA)开始开发一个独立的浏览器,叫做Mosaic。这是人类历史上第一个浏览器,从此网页可以在图形界面的窗口浏览。但是该浏览器还没有面向大众的普通用户。1994年10月,NCSA的一个主要......
    • day 08 8.2 前端基础之JavaScript基础【三】
      前端基础之JavaScript基础【三】【1】、jQuery介绍jQuery是什么jQuery是一个快速、简洁的JavaScript框架。jQuery设计的宗旨是“writeLess,DoMore”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件......
    • day 08 8.1 前端基础之JavaScript基础【二】
      前端基础之JavaScript基础【二】【1】、json序列化和反序列化JSON:JavaScript对象表示法,是一种轻量级的数据交换格式。易于人阅读和编写。//json是一种数据格式,语法一般是{}或者[]包含起来//内部成员以英文逗号隔开,最后一个成员不能使用逗号!//可以是键值对,也可以是列......
    • 每日八股文之Java
      1、如何利用Redis实现一个分布式锁?为什么要实现分布式锁、实现分布式锁的方式理论+实操:158、缓存-分布式锁-分布式锁原理与使用哔哩哔哩bilibili实现分布式锁的方式:方案一:SETNX+EXPIRE方案二:SETNX+value值是(系统时间+过期时间)方案三:使用Lua脚本(包含SETNX+EXPIRE......
    • 关于Java中方法重载和方法重写
      方法重写是子类继承父类(默认继承Object类)后覆盖父类的方法需要保证同名同参同返回值且访问权限范围不能缩小(public>protected>default>private)publicclassFather{ publicintmethod(){ return-1; }}classSonextendsFather{ //访问范围不能小返回值方法......
    • java-普通内部类和静态内部类区别
      静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中的变量、方法。如果要访问的话,必须要new一个外部类的对象,使用new出来的对象来访问。但是可以直接访问静态变量,调用静态的方法。普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性......
    • java创建对象的几种方法
      Java一共有5种方法可以来创建对象例如对象User;使用new的方式来创建对象,newUser(),这种方法使用了构造器2.使用class的newInstance()例如:Useruser=User.class.newInstance();这种方法也使用了构造器3.使用Constructor类的newInstance()方法创建对象,例如:Useruser=......