错误码: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()`这两个重要的集合接口方法,它们在处理Map容器时尤其关键。 `keySet()`方法返回一个Set视图,包含了Map中的所有键。这个Set不允许有重复的键,并且对它的修改会反映到原始...
Map接口定义了许多方法,如put()用于添加键值对,get()用于根据键查找对应的值,remove()用于删除键值对,size()返回Map中元素的数量,keySet()和values()分别返回键集和值集,entrySet()返回所有键值对的集合。...
- entrySet、keySet、values:分别返回键值对集合、键的集合和值的集合。 - clear:清空Map。 - equals和hashCode:用于比较两个Map是否相等和计算Map的哈希值。 5. SortedMap接口主要方法 - sortedMap接口扩展...
常见的遍历方式有三种:keySet、entrySet和values。很多开发者推荐使用entrySet,认为它比keySet更高效,因为entrySet能一次性获取键值对,避免了额外的查找操作。然而,这个观点并不总是准确的,实际性能可能因数据...
Map是存储键值对的数据结构,提供了keySet()和entrySet()两个方法来遍历其内容。 1. Map对象中的keySet()和entrySet()的区别在于它们返回的集合类型以及遍历方式。keySet()返回一个只包含键(Key)的Set集合,集合...
本文将深入探讨`HashMap`的遍历方法,包括`keySet()`和`entrySet()`两种主要方式,并通过代码示例对比它们的性能差异。 #### 方法一:使用`keySet()`遍历 `keySet()`方法返回`HashMap`中的所有键的集合视图。通过...
根据提供的内容,我们可以了解到遍历`HashMap`主要有两种方式:使用`keySet()`方法和使用`entrySet()`方法。 1. **使用keySet()方法** ```java Map map = new HashMap(); Iterator iter = map.keySet()....
今天,我们来讨论一种遍历Map的方式,即使用Map.Entry和Map.entrySet()。 Map.Entry是什么? ---------------- Map.Entry是一个接口,表示一个映射项,里面有Key和Value。它有两个方法:getKey()和getValue(),...
在上述的`HashMapTest`类中,通过对比`keySet()`和`entrySet()`遍历HashMap的时间,我们可以看到`entrySet()`方法通常比`keySet()`方法更快。`keySet()`需要两次遍历:一次是转换为迭代器,另一次是从HashMap中根据...
是的matlab代码在事件中锻炼。 数据结构 在本练习中,我们使用Java API提供的List , Set和Map数据结构。 此外,已经实现了ueb05.CorpusReader类,它提供了一个静态方法...keySet和values提供Collections 。 可以使用C
我们将重点讨论通过`entrySet()`方法和`keySet()`方法来实现遍历的过程。 #### 方法一:使用`entrySet()` `entrySet()`方法返回一个包含映射中的所有映射关系的`Set`视图。这使得我们可以迭代整个映射,同时访问每...
由测试结果可以看出,for each entrySet和for iterator entrySet的性能几乎相同,而for each keySet的性能较差。这是因为for each keySet需要再次调用get方法来获取值,增加了时间复杂度。 遍历方式结果分析 由...
本文将详细探讨在Java中遍历`Map`的两种常用方法:通过`keySet()`方法和通过`entrySet()`方法。 ### 一、通过`keySet()`方法遍历`Map` #### 方法概述 `keySet()`方法返回一个包含`Map`中所有键的`Set`视图。通过...
1. **通过Map.keySet遍历key和value** 这种方法是最直观的,直接获取Map的keySet并进行迭代。代码简洁,但存在效率问题。在遍历过程中,每次获取value都需要通过`map.get(key)`调用来查询,这可能导致额外的计算...
1. **步骤1**:通过`keySet()`或`entrySet()`方法获取键的集合或键值对的集合。 2. **步骤2**:使用增强for循环遍历集合。 3. **步骤3**:通过循环中的元素获取键和值,并打印出键值对。 #### 四、总结 本文介绍了...
这是最基础的遍历方式,通过获取`Map`的`keySet`,然后用增强型for循环遍历`keySet`,再通过`get()`方法获取对应的`value`。 ```java for (Integer in : map.keySet()) { String str = map.get(in); System.out...
在Java编程语言中,`HashMap`是一个非常常用的数据结构,它实现了`Map`接口,用于存储...通过`entrySet()`、`keySet()`或`values()`,我们可以根据需求选择合适的迭代方式,从而高效地遍历和处理`HashMap`中的数据。
System.out.println("通过Map.entrySet()和Iterator遍历key和value"); Iterator, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry, String> entry = it.next(); System.out....