`

entrySet和keySet之比较

阅读更多

错误码:WMI_WRONG_MAP_ITERATOR
案例:

StringBuffer resultDetail = new StringBuffer();
Iterator<String> it = resultDetailMap.keySet().iterator();
while (it.hasNext()) {
        String key = it.next().toString();
        resultDetail.append("标的号:" + entry.getKey() + ",原因:" + entry.getValue());
}
return resultDetail.toString();

Bug: Method JTAMainFrame.initView(JFrame) makes inefficient use of keySet iterator instead of entrySet iterator
Pattern id: WMI_WRONG_MAP_ITERATOR, type: WMI, category: PERFORMANCE

This method accesses the value of a Map entry, using a key that was retrieved from a keySet iterator. It is more efficient to use an iterator on the entrySet of the map, to avoid the Map.get(key) lookup.

 

解释:
很多人都这样遍历Map,没错,但是效率很低,先一个一个的把key遍历,然后在根据key去查找value,这不是多此一举么,为什么不遍历entry(桶)然后直接从entry得到value呢?它们的执行效率大概为1.5:1。
我们看看HashMap.get方法的源代码:

public V get(Object key) {    
    if (key == null)    
        return getForNullKey();    
    int hash = hash(key.hashCode());    
    for (Entry<K,V> e = table[indexFor(hash, table.length)];    
         e != null;    
         e = e.next) {    
        Object k;    
        if (e.hash == hash && ((k = e.key) == key || key.equals(k)))    
            return e.value;    
    }    
    return null;    
}

从这里可以看出查找value的原理,先计算出hashcode,然后散列表里取出entry,不管是计算hashcode,还是执行循环for以及执行 equals方法,都是CPU密集运算,非常耗费CPU资源,如果对一个比较大的map进行遍历,会出现CPU迅速飚高的现象,直接影响机器的响应速度,在并发的情况下,简直就是一场灾难。

解决方法:

StringBuffer resultDetail = new StringBuffer();
for (Entry<String, String> entry : resultDetailMap.entrySet()) {
        resultDetail.append("标的号:" + entry.getKey() + ",原因:" + entry.getValue());
}
return resultDetail.toString();

 

分享到:
评论

相关推荐

    集合嵌套集合并用迭代器输出,有关keySet()和entrySet()的练习

    此文件是用eclipse打包的,如果用eclipse工具可直接导入查看,如果用的是idea工具,可以打开bin下的.class文件之后,拖入到idea运行即可

    ist的matlab代码-uebung05:练习05

    是的matlab代码在事件中锻炼。 数据结构 在本练习中,我们使用Java API提供的List , Set和Map数据结构。 此外,已经实现了ueb05.CorpusReader类,它提供了一个静态方法...keySet和values提供Collections 。 可以使用C

    java map集合

    NULL 博文链接:https://hoochiang.iteye.com/blog/1816970

    java遍历特例

    // 方法二:jdk1.5支持,用entrySet()和For-Each循环() Java代码 for (Map.Entry, String&gt; m : emails.entrySet()) { logger.info("email-" + m.getKey() + ":" + m.getValue()); } for (Map....

    HashMap 概述 精讲 .md

    - KeySet 内部类 - Values 内部类 - EntrySet 内部类 - HashMap 1.7 的底层结构 - HashMap 1.8 的底层结构 - HashMap 重要属性 - HashMap 构造函数 - 讲一讲 HashMap put 的全过程 - Hash 函数 - 扩容机制...

    Java Map遍历方式的选择

    理由是:entrySet方法一次拿到所有key和value的集合;而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率。那么实际情况如何呢?  为了解遍历性能的真实差距,包括在...

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

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

    金陵科技学院软件院大二上Java高级1212Map.docx

    1212Map.doc 目的: 学会使用 Map、TreeMap 完成内容 1. 定义 Map, 加入一些数据 使用 entrySet 方式显示全部键、值其内容 使用 keySet 方式显示全部键、值内容 使用 values 显示全部值内容

    怎样遍历一个HashMap?

    &lt;br&gt;for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { &lt;br&gt; Map.Entry entry = (Map.Entry) iter.next(); &lt;br&gt; Object key = entry.getKey(); &lt;br&gt; Object val = entry.getValue()...

    pageDate封装参数,不用实体类

    Iterator entries = properties.entrySet().iterator(); Entry entry; String name = ""; String value = ""; while (entries.hasNext()) { entry = (Entry) entries.next(); name = (String) entry.get...

    Java容器.xmind

    Set,V&gt;&gt; entrySet​() 线程不安全,速度快,允许存放null键,null值。 SortedMap 标记: class TreeMap 对键进行排序 HashTable 标记: class Properties 标记: class 线程安全,速度慢,不允许存放null键,...

    sesvc.exe 阿萨德

    * for keySet() and values(). */ transient Set,V&gt;&gt; entrySet; /** * The number of key-value mappings contained in this map. */ transient int size; 和 1.7 大体上都差不多,还是有几个重要的区别: ...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    B .NULL与任何值的比较结果都为NULL。 C .NULL&lt;&gt;1的返回结果为true。 D .当某一列的值全是NULL时,sum(col)的返回结果为NULL。 多选 7.关于接口使用抛异常还是返回错误码,下列哪些说法符合《阿里巴巴Java开发...

    达内 coreJava 习题答案

    规律:一个数等于前两个数之和 //计算斐波那契数列(Fibonacci)的第n个值 public class Fibonacci{ public static void main(String args[]){ int n = Integer.parseInt(args[0]); int n1 = 1;//第一个数 int n2...

Global site tag (gtag.js) - Google Analytics