zoukankan      html  css  js  c++  java
  • HashMap循环遍历方式及其性能对比

    主要介绍HashMap的四种循环遍历方式,各种方式的性能测试对比,根据HashMap的源码实现分析性能结果,总结结论

    1. Map的四种遍历方式
    下面只是简单介绍各种遍历示例(以HashMap为例),各自优劣会在本文后面进行分析给出结论。

    (1) for each map.entrySet()

    (2) 显示调用map.entrySet()的集合迭代器

    (3) for each map.keySet(),再调用get获取

    (4) for each map.entrySet(),用临时变量保存map.entrySet()

    在测试前大家可以根据对HashMap的了解,想想上面四种遍历方式哪个性能更优。

    2、HashMap四种遍历方式的性能测试及对比
    以下是性能测试代码,会输出不同数量级大小的HashMap各种遍历方式所花费的时间。

    PS:如果运行报异常in thread “main” java.lang.OutOfMemoryError: Java heap space,请将main函数里面map size的大小减小。

    其中getHashMaps函数会返回不同size的HashMap。
    loopMapCompare函数会分别用上面的遍历方式1-4去遍历每一个map数组(包含不同大小HashMap)中的HashMap。
    print开头函数为输出辅助函数,可忽略。

    测试环境为Windows7 32位系统 3.2G双核CPU 4G内存,Java 7,Eclipse -Xms512m -Xmx512m
    最终测试结果如下:

    表横向为同一遍历方式不同大小HashMap遍历的时间消耗,纵向为同一HashMap不同遍历方式遍历的时间消耗。
    PS:由于首次遍历HashMap会稍微多耗时一点,for each的结果稍微有点偏差,将测试代码中的几个Type顺序调换会发现,for each entrySet耗时和for iterator entrySet接近。

    3、遍历方式性能测试结果分析
    (1) foreach介绍
    见:ArrayList和LinkedList的几种循环遍历方式及性能对比分析中介绍。

    (2) HashMap遍历方式结果分析
    从上面知道for each与显示调用Iterator等价,上表的结果中可以看出除了第三种方式(for each map.keySet()),再调用get获取方式外,其他三种方式性能相当。本例还是hash值散列较好的情况,若散列算法较差,第三种方式会更加耗时。
    我们看看HashMap entrySet和keySet的源码

    分别是keySet()和entrySet()返回的set的迭代器,从中我们可以看到只是返回值不同而已,父类相同,所以性能相差不多。只是第三种方式多了一步根据key get得到value的操作而已。get的时间复杂度根据hash算法而异,源码如下:

    get的时间复杂度取决于for循环循环次数,即hash算法。

    4、结论总结

    从上面的分析来看:
    a. HashMap的循环,如果既需要key也需要value,直接用

    即可,foreach简洁易懂。

    b. 如果只是遍历key而无需value的话,可以直接用

  • 相关阅读:
    leetcode 33. Search in Rotated Sorted Array
    leetcode 32. Longest Valid Parentheses
    leetcode 28. Implement strStr()
    leetcode 27. Remove Element
    leetcode 26. Remove Duplicates from Sorted Array
    leetcode 24. Swap Nodes in Pairs
    leetcode 22. Generate Parentheses
    树莓派的频率管理和热控制
    sql执行insert插入一条记录同时获取刚插入的id
    全程直播个人博客重构过程,采用springboot+dubbo+jpa技术栈。
  • 原文地址:https://www.cnblogs.com/cnndevelop/p/14422225.html
Copyright © 2011-2022 走看看