zoukankan      html  css  js  c++  java
  • Map集合的遍历

    Map集合遍历有两种方法
    第一:mapEntry方式
    第二:keySet方式
     
    HashMap 和Hashtable 的区别
    - HashMap允许键和值是null,而Hashtable不允许键或者值是null。
    - Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
    - HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败(具体看下文)的。另一方面,Hashtable提供了对键的列举(Enumeration)。
      - 一般认为Hashtable是一个遗留的类。
     

    Map集合的第一种遍历方式【效率高】:

    思路:这种方式的思想是把Map集合调用entrySet()方法整体保存到一个Set集合中,再迭代获取Entry对象,然后从Entry对象中取得key和value。效率高!!!

    [java] view plain copy
    1. public class HashMapTest {  
    2.   
    3.     public static void main(String[] args) {  
    4.   
    5.         /* 创建一个map集合 */  
    6.         Map maps = new HashMap<>();  
    7.   
    8.         /* 往集合中添加数据 */  
    9.         maps.put("id", "0113285");  
    10.         maps.put("name", "张三");  
    11.         maps.put("sex", "男");  
    12.           
    13.         /*出现两个相同的key,编译是不会报错的。但是不能保存到集合中*/  
    14.         maps.put("id", "0113285");  
    15.         /*key和value都可以是null值*/  
    16.         maps.put(null, "hello");  
    17.           
    18.         System.out.println(maps.size());  
    19.   
    20.         /* 把maps集合存储到一个Set结合中,然后再调用iterator()方法,获取一个遍历的迭代器 */  
    21.         Iterator it = maps.entrySet().iterator();  
    22.         /* 遍历 */  
    23.         while (it.hasNext()) {  
    24.             /* 从迭代器中获取一个entry对象 */  
    25.             Entry entry = (Entry) it.next();  
    26.             /* 通过entry.getKey()的方法获取key值 */  
    27.             System.out.println("key:" + entry.getKey());  
    28.             /* 通过entry.getValue()的方法获取value值 */  
    29.             System.out.println("value:" + entry.getValue());  
    30.         }  
    31.     }  
    32.   
    33. }  


    注:

    1:Map集合中key和value都可以是null值!

    2:出现两个相同的key值,编译是不会报错的,但是只能保存一个对象到集合中!

    第二种遍历方式【效率低】:

    思路:这种方式的思想是把map集合的key存到一个Set集合中,再遍历key,然后通过key去获取对应的value值。效率比较低!!!

    [java] view plain copy
    1. public class HashMapTest {  
    2.   
    3.     public static void main(String[] args) {  
    4.   
    5.         /* 创建一个map集合 */  
    6.         Map maps = new HashMap<>();  
    7.   
    8.         /* 往集合中添加数据 */  
    9.         maps.put("id", "0113285");  
    10.         maps.put("name", "张三");  
    11.         maps.put("sex", "男");  
    12.         maps.put(null, "hello");  
    13.   
    14.         /* 把map集合中的Key存储到一个Set集合中,然后调用itera()方法获取一个迭代器 */  
    15.         Iterator it = maps.keySet().iterator();  
    16.         /* 遍历key,通过key的值获取value */  
    17.         while (it.hasNext()) {  
    18.   
    19.             /* 获取key */  
    20.             Object key = it.next();  
    21.             System.out.println("key:" + key);  
    22.             /* 通过key值获取value值 */  
    23.             Object value = maps.get(key);  
    24.             System.out.println("value" + value);  
    25.         }  
    26.     }  
    27.   
    28. }  

    上面老说entrySet的方式比keySet的方式效率高,真的吗?我么可以通过一个程序来测试一下:
    [java] view plain copy
    1. public class HashMapTest {  
    2.   
    3.     public static void main(String[] args) {  
    4.           
    5.         /*获取程序开始的时间*/  
    6.         long startTime = System.currentTimeMillis();  
    7.           
    8.         /* 创建一个map集合 */  
    9.         Map maps = new HashMap<>();  
    10.         /*循环往集合中添加数据*/  
    11.         for (int i =0; i<8000000; i++){  
    12.             maps.put(i, "张三"+i);  
    13.         }  
    14.           
    15.         /*调用第一种方式,测试运行时间*/  
    16.         iteratorByEntrySet(maps);  
    17.           
    18.         /*调用第二种方式,测试运行时间*/  
    19.         //iteratorByKeySet(maps);  
    20.           
    21.         /*获取程序借宿需要的时间*/  
    22.         long endTime = System.currentTimeMillis();  
    23.           
    24.         System.out.println("通过EntrySet遍历的效率:" + (endTime - startTime));  
    25.         //System.out.println("通过keySet遍历的效率:" + (endTime - startTime));  
    26.           
    27.     }  
    28.       
    29.     /** 
    30.      * 通过keySet方式遍历Map集合 
    31.      * @param map 
    32.      */  
    33.     public static void iteratorByKeySet(Map map){  
    34.           
    35.         /* 把map集合中的Key存储到一个Set集合中,然后调用itera()方法获取一个迭代器 */  
    36.         Iterator it = map.keySet().iterator();  
    37.         /* 遍历key,通过key的值获取value */  
    38.         while (it.hasNext()){  
    39.             /* 获取key */  
    40.             Object key = it.next();  
    41.             Object value = map.get(key);  
    42.         }  
    43.     }  
    44.   
    45.     /** 
    46.      * 通过entrySet方式遍历Map集合 
    47.      * @param map 
    48.      */  
    49.     public static void iteratorByEntrySet(Map map){  
    50.         /* 把maps集合存储到一个Set结合中,然后再调用iterator()方法,获取一个遍历的迭代器 */  
    51.         Iterator it = map.entrySet().iterator();  
    52.           
    53.         while (it.hasNext()){  
    54.             /*获取Entry对象*/  
    55.             Entry entry = (Entry) it.next();  
    56.             /*从entry对象中直接获取key和value*/  
    57.             Object key = entry.getKey();  
    58.             Object value = entry.getValue();  
    59.         }  
    60.     }  
    61. }  

    运行程序我们可以发现:

    entrySet遍历的时间为:15100ms

    keySet遍历的时间为:24084ms

    所以:entrySet的效率高于keySet !!!!
  • 相关阅读:
    基于uds的bootloader开发中的意外情况
    TC275的overlay的使用示例-用于XCP标定
    react + antd Table实现表格数据合并
    vue-cli引入静态资源报错及引入方法
    react + antd form表单验证自定义验证validator根据后台接口判断验证
    react hook + antd upload 通过fileList控制文件列表展示status为uploading
    create react app创建的react项目+typescript配置项目根路径
    react hook+antd实现点击发送验证码功能
    react.js antd-table 可编辑表格验证
    ant-design-pro protable 树形表格默认展开
  • 原文地址:https://www.cnblogs.com/anzhi/p/7443589.html
Copyright © 2011-2022 走看看