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

HashMap 中的keySet()和entrySet()方法的比较

2014年09月23日 ⁄ 综合 ⁄ 共 1384字 ⁄ 字号 评论关闭

在用Coverity(代码检视工具)进行代码检视时,凡是对于HashMap中使用keyset方法的地方全部报warning,说使用了低效的方法,然后建议使用entrySet替代,当时不太清楚entrySet的用法,也没管神马warning,结果发现它在每个这样使用的地方都报了warning,不得不重视了,然后就对这二者进行了一些学习,现将学习心得贴出来。。。 
被警告的代码如下: 

Java代码  收藏代码
  1. public static void setValues2SessionMap(ControllerData cd,Map<String,Object> valueMap)  
  2.     {  
  3.         Map<String,Object> sessionMap = DSViewHelper.getInstance().getSessionMap();  
  4.         for(String valName :valueMap.keySet())  
  5.         {  
  6.             String key = cd.getDeckId()+"."+valName;  
  7.             Object value = valueMap.get(valName);  
  8.             //other code here...  
  9.         }  
  10.           
  11.     }  


翻阅JDK,看entrySet()的用法,发现返回的Set对象中的泛型类型为Map.Entry<K,V>,而keySet()返回的Set对象中的泛型类型为K, 这个估计看着区别会比较晕,还是直接看代码爽快。修改后的代码: 

Java代码  收藏代码
  1. public static void setValues2SessionMap(ControllerData cd,Map<String,Object> valueMap)  
  2. {  
  3.     Map<String,Object> sessionMap = DSViewHelper.getInstance().getSessionMap();  
  4.     Set<Map.Entry<String, Object>> keyEntrySet = valueMap.entrySet();  
  5.     for(Map.Entry<String, Object> entry:keyEntrySet)  
  6.     {  
  7.         String key = cd.getDeckId()+"."+entry.getKey();  
  8.         Object value = entry.getValue();  
  9.           
  10.         //other code here...  
  11.     }  
  12.       
  13. }  


使用后发现使用entrySet其实也挺方便的,而且按照Coverity的说法,也更加高效了,至于为何更加高效,还没有花费时间去琢磨,正如我之前的文章中 Integer.valueOf() 和new Integer()二者效率的比较http://feikiss.iteye.com/admin/blogs/1285283一样,只要愿意花时间去琢磨,肯定能有新的收获的。不过暂时木有这么多精力,还是先用再探究吧~~

【上篇】
【下篇】

抱歉!评论已关闭.