java 代码:

  • import java.util.HashMap;
  • import java.util.Iterator;
  • import java.util.Map;
  • public class MapTest {
  • public static void main(String[] args) {
  • Map<String, String> map = new HashMap<String, String>();
  • map.put("1", "1");
  • map.put("2", "2");
  • map.put("3", "3");
  • // 第一种:通过Map.keySet遍历key和value
  • System.out.println("通过Map.keySet遍历key和value:");
  • for (String key : map.keySet()) {
  • System.out.println("key= " + key + "  and  value= " + map.get(key));
  • }
  • // 第二种:通过Map.entrySet使用iterator遍历key和value
  • System.out.println("通过Map.entrySet使用iterator遍历key和value:");
  • Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
  • while (it.hasNext()) {
  • Map.Entry<String, String> entry = it.next();
  • System.out.println("key= " + entry.getKey() + "  and  value= "
  • + entry.getValue());
  • }
  • // 第三种:通过Map.entrySet遍历key和value
  • System.out.println("通过Map.entrySet遍历key和value:");
  • for (Map.Entry<String, String> entry : map.entrySet()) {
  • System.out.println("key= " + entry.getKey() + "  and  value= "
  • + entry.getValue());
  • }
  • // 第四种:通过Map.values()遍历所有的value,但是不能遍历键key
  • System.out.println("通过Map.values()遍历所有的value:");
  • for (String v : map.values()) {
  • System.out.println("value= " + v);
  • }
  • }
  • }
  • 结果
  • 通过Map.keySet遍历key和value:
  • key= 3  and  value= 3
  • key= 2  and  value= 2
  • key= 1  and  value= 1
  • 通过Map.entrySet使用iterator遍历key和value:
  • key= 3  and  value= 3
  • key= 2  and  value= 2
  • key= 1  and  value= 1
  • 通过Map.entrySet遍历key和value:
  • key= 3  and  value= 3
  • key= 2  and  value= 2
  • key= 1  and  value= 1
  • 通过Map.values()遍历所有的value:
  • value= 3
  • value= 2
  • value= 1 

    这四种方法都可以遍历map:

    第一种是目前许多人最喜欢的一种方式,因为代码最少,看起来最简单,通过遍历keySet,再将key所对应的value查询出来,这里有一个二次取值的过程,所以并不推荐;

    第二种和第三种原理是相同的,都是通过遍历Map.Entry的方式,将Entry中的key和value打印出来,第三种是比较推荐写法,因为采用jdk1.5后的遍历形式,代码看起来比较整洁;

    第四种比较少用,因为我们大多数时候都是同时需要key和value的

    综上所述,如果map里面内容比较少,其实采用哪种方式都可以,第一种和第三种相对简洁一些;但是一旦容量非常大时,更推荐采用第三种方式,相比于第一种将极大地节省性能。

    修改一下代码,对执行时间执行一下测试

    1. import java.util.HashMap;
    2. import java.util.Map;
    3. public class MapTest {
    4. static long MAX_LONG = 1000000L;
    5. static int TIMES = 10;
    6. static Map<String, String> map1 = new HashMap<String, String>();
    7. static Map<String, String> map2 = new HashMap<String, String>();
    8. static {
    9. for (long i = 0; i < MAX_LONG; i++) {
    10. map1.put("1" + i, "abc" + i);
    11. map2.put("2" + i, "def" + i);
    12. }
    13. }
    14. public static void main(String[] args) {
    15. String valueStr = "";
    16. String keyStr = "";
    17. long start, end;
    18. double totalMs;
    19. totalMs = 0;
    20. for (int i = 0; i < TIMES; i++) {
    21. // 通过Map.keySet遍历key和value
    22. start = System.currentTimeMillis();
    23. for (String key : map1.keySet()) {
    24. keyStr = key;
    25. valueStr = map1.get(key);
    26. }
    27. end = System.currentTimeMillis();
    28. System.out.println("通过Map.keySet遍历key和value耗时 " + (end - start)
    29. + " ms ");
    30. totalMs += (end - start);
    31. }
    32. System.out.println("Times : " + TIMES + ", totalMs : " + totalMs
    33. + "ms, average :" + totalMs / TIMES + "ms");
    1. }
    2. }

    以下是测试结果:

    1. 通过Map.keySet遍历key和value耗时 186 ms
    2. 通过Map.keySet遍历key和value耗时 189 ms
    3. 通过Map.keySet遍历key和value耗时 87 ms
    4. 通过Map.keySet遍历key和value耗时 89 ms
    5. 通过Map.keySet遍历key和value耗时 84 ms
    6. 通过Map.keySet遍历key和value耗时 92 ms
    7. 通过Map.keySet遍历key和value耗时 85 ms
    8. 通过Map.keySet遍历key和value耗时 94 ms
    9. 通过Map.keySet遍历key和value耗时 89 ms
    10. 通过Map.keySet遍历key和value耗时 91 ms
    11. Times : 10, totalMs : 1086.0ms, average :108.6ms
    12. 通过Map.entrySet遍历key和value耗时 112 ms
    13. 通过Map.entrySet遍历key和value耗时 98 ms
    14. 通过Map.entrySet遍历key和value耗时 71 ms
    15. 通过Map.entrySet遍历key和value耗时 65 ms
    16. 通过Map.entrySet遍历key和value耗时 65 ms
    17. 通过Map.entrySet遍历key和value耗时 64 ms
    18. 通过Map.entrySet遍历key和value耗时 64 ms
    19. 通过Map.entrySet遍历key和value耗时 65 ms
    20. 通过Map.entrySet遍历key和value耗时 65 ms
    21. 通过Map.entrySet遍历key和value耗时 65 ms
    22. Times : 10, totalMs : 734.0ms, average :73.4ms    可以看出,百万级别的量时,使用keySet和entrySet遍历,执行时间大概为1.5:1,这并不是最主要的差异。真正的差异还是必须看代码
    1. map.get(key))

    时执行的hash操作

    1. /**
    2. * Returns the value to which the specified key is mapped,
    3. * or {@code null} if this map contains no mapping for the key.
    4. *
    5. * <p>More formally, if this map contains a mapping from a key
    6. * {@code k} to a value {@code v} such that {@code (key==null ? k==null :
    7. * key.equals(k))}, then this method returns {@code v}; otherwise
    8. * it returns {@code null}.  (There can be at most one such mapping.)
    9. *
    10. * <p>A return value of {@code null} does not <i>necessarily</i>
    11. * indicate that the map contains no mapping for the key; it's also
    12. * possible that the map explicitly maps the key to {@code null}.
    13. * The {@link #containsKey containsKey} operation may be used to
    14. * distinguish these two cases.
    15. *
    16. * @see #put(Object, Object)
    17. */
    18. public V get(Object key) {
    19. if (key == null)
    20. return getForNullKey();
    21. int hash = hash(key.hashCode());
    22. for (Entry<K,V> e = table[indexFor(hash, table.length)];
    23. e != null;
    24. e = e.next) {
    25. Object k;
    26. if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
    27. return e.value;
    28. }
    29. return null;
    30. }

    计算hashCode是CPU密集运算,非常耗费CPU资源,如果对一个比较大的map进行遍历,会出现CPU迅速飚高的现象,直接影响机器的响应速度,在多线程的情况下,简直就是一场灾难,而采用entrySet来进行遍历,则无此问题,对这个有兴趣的同学,可以使用自己的机器试一试。

java遍历map方法的更多相关文章

  1. java 遍历map 方法 集合 五种的方法

    package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Itera ...

  2. Java遍历Map键、值。获取Map大小的方法

    Map读取键值对,Java遍历Map的两种实现方法 第一种方法是根据map的keyset()方法来获取key的set集合,然后遍历map取得value的值 import java.util.HashM ...

  3. java 遍历map的方法

    package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Itera ...

  4. java 遍历Map的四种方式

      java 遍历Map的四种方式 CreationTime--2018年7月16日16点15分 Author:Marydon 一.迭代key&value 第一种方式:迭代entrySet 1 ...

  5. Java遍历Map对象的四种方法

    在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHa ...

  6. java 遍历Map的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  7. JAVA遍历Map的方法

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestMap { pu ...

  8. java 遍历map的四种方法

    16:21:42 Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项( ...

  9. java遍历map的四种方式

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

随机推荐

  1. 黑马程序员-hashtable

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列 ...

  2. 第一章 Javascript基础

    一.Javascript概述(知道) a.一种基于对象和事件驱动的脚本语言 b.作用: 给页面添加动态效果 c.历史: 原名叫做livescript.W3c组织开发的标准叫ECMAscipt. d.特 ...

  3. <address>标签,为网页加入地址信息

    一般网页中会有一些网站的联系地址信息需要在网页中展示出来,这些联系地址信息如公司的地址就可以<address>标签.也可以定义一个地址(比如电子邮件地址).签名或者文档的作者身份. 语法: ...

  4. /root/.bashrc与/etc/profile的异同

    要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是loginshell 和non-loginshell. 交互式模式就是shell等待你的输入,并 ...

  5. ajax省市线三级联动

    <script type='text/javascript' src='http://ajax.useso.com/ajax/libs/jquery/1.7.2/jquery.min.js?ve ...

  6. JS中区分参数方法

    实现功能:在使用cocosjs制作游戏过程中,很多东西都可以重复使用,例如菜单栏等等.今天尝试写了一个自定义的Js文件用作菜单方便以后使用. 将菜单按钮,以及触发事件作为参数生成一个层 直接在游戏中使 ...

  7. Javascript数组方法探究一二

    1. Array.prototype.slice方法 数组的 slice 方法通常用来从一个数组中抽取片断.不过,它还有将“类数组”(比如arguments和​HTMLCollection​)转换为真 ...

  8. Linux 0.11下信号量的实现和应用

    Linux 011下信号量的实现和应用 生产者-消费者问题 实现信号量 信号量的代码实现 关于sem_wait和sem_post sem_wait和sem_post函数的代码实现 信号量的完整代码 实 ...

  9. ajax+XMLHttpRequest里的FormData实现图片异步上传

    发这篇博客的时候我是自己在研究这个XMLHttpRequest请求,在别人的博客上面知道XMLHttpRequest新加了一个FormData的东西,好像现在APP请求后台也有用这种方式的吧. 别的不 ...

  10. Day6 反射、模块、正则表达式和算法

    递归完成阶乘 def func(num): if num == 1: return 1 return num * func(num - 1) x = func(7) print(x) 反射 commo ...