`
jianweicao
  • 浏览: 119694 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java遍历map方法

 
阅读更多

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里面内容比较少,其实采用哪种方式都可以,第一种和第三种相对简洁一些;但是一旦容量非常大时,更推荐采用第三种方式,相比于第一种将极大地节省性能。

     

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

     

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

     以下是测试结果:

    Java代码
    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  
      [java] view plaincopy
       
      1.    
       可以看出,百万级别的量时,使用keySet和entrySet遍历,执行时间大概为1.5:1,这并不是最主要的差异。真正的差异还是必须看代码
    Java代码
    1. map.get(key))  
    [java] view plaincopy
     
    1. map.get(key))  

    时执行的hash操作

    Java代码
    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

    ### 二、使用keySet遍历Map `Map`提供了一个`keySet()`方法,该方法返回`Map`中所有键的集合视图。通过这个方法,我们可以获取到一个包含所有键的`Set`集合,然后使用迭代器(`Iterator`)或增强型for循环(foreach...

    遍历MAP的几种方法

    遍历MAP的几种方法,利用keyset进行遍历,它的优点在于可以根据你所想要的key值得到你想要的 values,更具灵活性

    JAVA遍历Map所有元素.doc

    本文将详细讲解两种主要的遍历Map元素的方法,并分析它们的效率差异。 ### 方法一:通过`entrySet()`遍历 这是推荐的遍历Map元素的方式,因为它具有较高的效率。通过调用`Map.entrySet()`方法,我们可以获取到Map...

    java遍历Map的几种方法分析

    在Java编程中,Map接口是用于存储键值对的数据结构,它提供了多种遍历Map的方法。本篇文章将详细分析Java中遍历Map的四种常见方法,帮助开发者更好地理解和运用这些技巧。 1. **for-each循环遍历** Java 5引入了...

    java遍历Map对象的说有数据

    ### Java遍历Map对象的所有数据 在Java编程中,`Map`接口是Java集合框架中的一个关键组成部分,它用于存储键值对。本篇文章将详细解释如何遍历`Map`对象的所有数据,并介绍几种常见的遍历方法。我们将重点讨论通过`...

    java Map 遍历方法

    #### 一、使用Iterator遍历Map 1. **通过`entrySet()`获取迭代器** 使用`Map.entrySet()`方法可以返回`Map`中所有映射关系的`Set`视图,然后可以通过迭代这个`Set`来遍历整个`Map`。 ```java Map, String&gt; ...

    另一种遍历Map的方式

    Map是一种常用的数据结构,在Java中有多种遍历Map的方式。今天,我们来讨论一种遍历Map的方式,即使用Map.Entry和Map.entrySet()。 Map.Entry是什么? ---------------- Map.Entry是一个接口,表示一个映射项,...

    java遍历JSON树

    ### Java遍历JSON树知识点详解 #### 一、前言 在处理Web应用程序中的数据时,JSON(JavaScript Object Notation)是一种非常常见的数据格式。它轻量级且易于读写,因此广泛应用于前后端的数据交互中。对于Java...

    java 遍历MAP的几种方法示例代码

    以下是Java中遍历Map的几种常见方法,包括使用增强的for循环、迭代器以及通过keySet()和entrySet()方法: 1. **增强的for循环(foreach)** 增强的for循环是Java 5引入的新特性,它可以简洁地遍历集合。对于Map,...

    java中Map的两种遍历方法

    本文将详细探讨在Java中遍历`Map`的两种常用方法:通过`keySet()`方法和通过`entrySet()`方法。 ### 一、通过`keySet()`方法遍历`Map` #### 方法概述 `keySet()`方法返回一个包含`Map`中所有键的`Set`视图。通过...

    map遍历的四种方法

    ### Map遍历的四种方法 在Java编程语言中,`Map`是一种常用的数据结构,用于存储键值对。为了能够有效地处理和操作这些键值对数据,熟练掌握遍历`Map`的方法至关重要。本文将详细介绍四种不同的遍历`Map`的方式,并...

    Java Map 遍历实例与效率比较

    主要提供java中的map的遍历实例及效率比较

    java集合map取key使用示例 java遍历map

    在Java编程中,集合框架是处理数据的重要...总之,Java中遍历Map有多种方法,具体选择取决于你的需求。使用`entrySet()`、`keySet()`或`values()`,配合迭代器或增强的for循环,都可以方便地访问和操作Map中的键值对。

    Map最常规的两种遍历方法

    两种方法都可以用于遍历Map集合,但是它们之间有一些区别。在实际开发中,我们可以根据实际情况选择合适的遍历方法。 优点和缺点 使用values()方法和Iterator迭代器的优点: * 该方法能够快速地遍历Map集合中的...

    java中Map集合的常用遍历方法及HashMap的应用实例

    1、遍历Map.entrySet():它的每一个元素都是Map.Entry对象,这个对象中, 放着的就是Map中的某一对key-value; 2、遍历Map.keySet():它是Map中key值的集合,我们可以通过遍历这个集合来 读取Map中的元素; 3、...

    java 遍历Map及Map转化为二维数组的实例

    "java 遍历Map及Map转化为二维数组的实例" 在 Java 编程语言中,遍历 Map 及将其转化为二维数组是一种常见的操作。本文将详细介绍如何使用 Java 遍历 Map 及将其转化为二维数组,并提供实例代码以供参考。 1. 使用...

    Java遍历Map键、值和获取Map大小的方法示例

    总结一下,Java中遍历Map主要有两种方法:通过`keySet()`遍历键并获取值,或通过`entrySet()`直接遍历键值对。获取Map大小则简单地调用`size()`方法即可。这些基本操作对于理解和使用Map数据结构至关重要,无论是在...

    java Map遍历方法

    这篇博文主要探讨了如何遍历Java中的`Map`对象,下面将详细介绍几种常见的遍历`Map`的方法。 1. **迭代器法**: Java提供了`Map`接口的`entrySet()`方法,返回一个包含`Map`中所有键值对的`Set`视图。通过这个`Set...

    java集合MAP三种遍历

    本文将详细介绍Java中Map集合的三种遍历方法及其应用场景、优缺点等,帮助读者更好地理解和掌握Map的使用技巧。 ### 一、Map简介 `Map`接口是Java集合框架的一部分,它提供了基于键值对的数据存储方式。常见的实现...

Global site tag (gtag.js) - Google Analytics