现在的位置: 首页 > 综合 > 正文

HashMap的2种遍历方式比较

2014年02月21日 ⁄ 综合 ⁄ 共 1673字 ⁄ 字号 评论关闭

首先我们准备数据,准备一个map

Java代码  收藏代码
  1. Map<String, String> map = new HashMap<String, String>();  
  2. for (int i = 0; i < 10; i++) {  
  3.     map.put(i + """value" + i);  
  4. }  

然后我们采用传说中的key遍历:

步骤:先弄成key set,然后遍历key set 通过key从map中获取value

Java代码  收藏代码
  1. Iterator<String> iterator = map.keySet().iterator();  
  2. while (iterator.hasNext()) {  
  3.     String key = iterator.next();  
  4.     String val = map.get(key);  
  5.     System.out.println(key + "->" + val);  
  6. }  
  7. System.out.println("*********************");  

然后我们在采用entrySet的方式遍历下:

步骤:先弄成entrySet 然后遍历他,获取key和value

Java代码  收藏代码
  1. Set<Entry<String, String>> set = map.entrySet();  
  2. Iterator<Entry<String, String>> s = set.iterator();  
  3. while (s.hasNext()) {  
  4.     Entry<String, String> en = s.next();  
  5.     String key = en.getKey();  
  6.     String val = en.getValue();  
  7.     System.out.println(key + "->" + val);  
  8. }  

孰优孰劣?

看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()从entryset中获取key,也就是说是在entry set的基础上来做的,貌似多次一举

结论:

通过上述代码我们就知道,采用entrySet方式要优于keySet,因为keySet首先要访问entrySet来组建一个keySet,重复工作不言而喻

抱歉!评论已关闭.