• 谨慎使用keySet:对于HashMap的2种遍历方式比较


     HashMap存储的是键值对,所以一般情况下其遍历同List及Set应该有所不同.

    但java巧妙的将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了HashMap的遍历处理,使其遍历同List、Set并无差异.

    第一种:

    Java代码 
    1. Map map = new HashMap();   
    2. Iterator iter = map.entrySet().iterator();   
    3. while (iter.hasNext()) {   
    4.     java.util.Map.Entry entry = (Map.Entry) iter.next();   
    5.     Object key = entry.getKey();   
    6.     Object val = entry.getValue();   
    7. }  

    第二种:

    Java代码 
    1. Map map = new HashMap();   
    2. Iterator iter = map.keySet().iterator();   
    3. while (iter.hasNext()) {   
    4.     Object key = iter.next();   
    5.     Object val = map.get(key);   
    6. }
     
     
    例如: 
      HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例: 
    Java代码 
    1. public class HashMapTest {   
    2.   
    3.   public static void main(String[] args) ...{   
    4.   
    5.   HashMap hashmap = new HashMap();   
    6.   for (int i = 0; i < 1000; i ) ...{   
    7.       hashmap.put("" i, "that's all");   
    8.   }   
    9.   long num = Calendar.getInstance().getTimeInMillis();   
    10.   Iterator iterator = hashmap.keySet().iterator();   
    11.   
    12.   while (iterator.hasNext()) ...{   
    13.       System.out.print(hashmap.get(iterator.next()));   
    14.   }   
    15.   System.out.println();   
    16.   System.out.println(Calendar.getInstance().getTimeInMillis() - num);   
    17.   listHashMap();   
    18.   }   
    19.   public static void listHashMap() ...{   
    20.         java.util.HashMap hashmap = new java.util.HashMap();   
    21.     
    22.       for (int i = 0; i < 1000; i ) ...{   
    23.      hashmap.put("" i, "that's all");   
    24.   }   
    25.   long num = Calendar.getInstance().getTimeInMillis();   
    26.   java.util.Iterator it = hashmap.entrySet().iterator();   
    27.   while (it.hasNext()) ...{   
    28.   java.util.Map.Entry entry = (java.util.Map.Entry) it.next();   
    29.   // entry.getKey() 返回与此项对应的键   
    30.   // entry.getValue() 返回与此项对应的值   
    31.   System.out.print(entry.getValue());   
    32.   }   
    33.   System.out.println();   
    34.   System.out.println(Calendar.getInstance().getTimeInMillis() - num);   
    35.   }   
    36.   } 
     
     

    看JDK源码,对比两种访问方式:

    首先看KeySet访问方式:

    Java代码 
    1.    public Set<K> keySet() {  
    2. if (keySet == null) {  
    3.     keySet = new AbstractSet<K>() {  
    4.     public Iterator<K> iterator() {  
    5.         return new Iterator<K>() {  
    6.         private Iterator<Entry<K,V>> i = entrySet().iterator();  
    7.   
    8.         public boolean hasNext() {  
    9.             return i.hasNext();  
    10.         }  
    11.   
    12.         public K next() {  
    13.             return i.next().getKey();  
    14.         }  
    15.   
    16.         public void remove() {  
    17.             i.remove();  
    18.         }  
    19.                    };  
    20.     }  
    21.   
    22.     public int size() {  
    23.         return AbstractMap.this.size();  
    24.     }  
    25.   
    26.     public boolean contains(Object k) {  
    27.         return AbstractMap.this.containsKey(k);  
    28.     }  
    29.     };  
    30. }  
    31. return keySet;  
    32.    }
     
    结论:
    通过上边的测试我们可以看出,采用entrySet方式遍历效率要优于keySet,因此在开发中要使用entrySet,尽量避免少使用keySet。
  • 相关阅读:
    简单地通过Python库使用python的socket编程
    js 实现继承的几种方式
    JAVA中获取当前系统时间
    IntelliJ Idea 常用快捷键列表
    关于报错:There is already 'xxxController' bean method的解决方法
    mysql 使用 GROUP BY 时报错 ERROR 1055 (42000)
    安装系统,用cmd进行分区
    Bootstrap关闭当前页
    bootstrap的日期选择器
    Bootstrap如何关闭弹窗
  • 原文地址:https://www.cnblogs.com/wzhanke/p/4817800.html
Copyright © 2020-2023  润新知