错误案例
现象描述: 在生成环境发现,偶尔生产环境的某台机器CPU使用率很高,经过定位发现是有一个大的HashMap(HashMap里面存放了大量数据,比如1W条)做循环引起的。
错误分析
遍历一个HashMap
for(Iterator ite = map.keySet().iterator(); ite.hasNext();){
Object key = ite.next();
Object value = map.get(key);
}
通过Map类的get(key)方法获取value时,会进行两次hashCode的计算,消耗CPU资源;而使用entrySet的方式,map对象会直接返回其保存key-value的原始数据结构对象,遍历过程无需进行错误代码中耗费时间的hashCode计算; 这在大数据量下,体现的尤为明显。
以下是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;
}
正确用法
正确用法:
for(Iterator ite = map.entrySet().iterator(); ite.hasNext();){
Map.Entry entry = (Map.Entry) ite.next();
entry.getKey();
entry.getValue();
}
分享到:
相关推荐
在Java中,我们可以使用EntrySet的迭代器来遍历HashMap中的数据。其实现代码如下: ```java Iterator, String>> iterator = coursesMap.entrySet().iterator(); while (iterator.hasNext()) { Entry, String> entry...
本篇文章将详细介绍如何使用简单的方法来遍历HashMap,通过实例代码帮助理解。 HashMap遍历的常用方法主要有三种:迭代器(Iterator)遍历、键集(KeySet)遍历以及 Entry 集(entrySet)遍历。下面将逐一介绍这些...
3. 通过Map.entrySet遍历key和value 这是一种使用增强for循环遍历键值对的方法。 ```java for (Map.Entry, String> entry : map.entrySet()) { System.out.println("key= " + entry.getKey() + " and value= " + ...
遍历HashMap是常见的操作,本文将介绍六种不同的方法来实现这一功能。 1. **方式一:使用KeySet方法** KeySet方法返回HashMap中所有键的Set视图。由于Set接口实现了Iterable接口,我们可以使用for-each循环来遍历...
System.out.println("使用entrySet遍历时耗时:" + (endTime - startTime) + "ms"); ``` ### 结论 通过对比可以发现,`entrySet()`遍历`HashMap`的方法在大多数情况下都比`keySet()`方法更加高效,尤其是当涉及到...
使用Iterator可以遍历HashMap的所有entry,然后使用Iterator的remove方法来删除元素。 解决方法 要解决HashMap遍历删除元素的问题,可以使用Iterator来遍历HashMap,并使用Iterator的remove方法来删除元素。这样...
可以通过2种方法遍历HashMap <br>Map map = new HashMap(); <br>for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { <br> Map.Entry entry = (Map.Entry) iter.next(); <br> Object ...
- 遍历HashMap时修改HashMap(添加、删除元素)可能会导致`ConcurrentModificationException`,因为迭代器无法检测到这种并发修改。 - 使用`keySet()`遍历并删除元素是安全的,但效率较低,因为这涉及到两次查找:...
5. 取得键值对集合:使用 entrySet() 方法取得 HashMap 中的所有键值对,并将其转换为集合。 HashMap 的遍历 1. 使用迭代器遍历:使用 iterator() 方法取得 HashMap 的迭代器,然后使用 hasNext() 和 next() 方法...
Java HashMap 遍历和删除元素方法小结 Java HashMap 是一种常用的数据结构,用于存储键值对儿,但是在遍历和删除元素时,需要注意一些特殊的情况,否则可能会出现异常或错误。本文将介绍 Java HashMap 遍历和删除...
- 遍历HashMap时,由于内部实现细节,顺序可能不稳定,因为哈希函数可能会导致元素在数组中的顺序发生变化。如果需要稳定的遍历顺序,可以考虑使用`LinkedHashMap`,它在保持效率的同时,按照插入顺序或访问顺序遍历...
#### 遍历HashMap的方法 根据提供的内容,我们可以了解到遍历`HashMap`主要有两种方式:使用`keySet()`方法和使用`entrySet()`方法。 1. **使用keySet()方法** ```java Map map = new HashMap(); Iterator ...
6. **遍历HashMap**:有两种方式遍历HashMap,一是通过`entrySet()`获取键值对的迭代器,二是通过`keySet()`获取键的迭代器再获取对应的值。 ```java for (Map.Entry, String> entry : map.entrySet()) { System....
entrySet()方法在遍历过程中提供键值对的完整信息,适用于需要同时处理键和值的情况;keySet()方法适用于只关心键而不关心键对应的值的情况,而values()方法则适用于只关心值,不需要键的情况。 在实际开发中,...
2. **遍历HashMap** 使用`entrySet()`或`keySet()`的方式同样适用于遍历`HashMap`。 ```java HashMap, Object> hash = new HashMap(); hash.put(3, 3); hash.put(4, 4); hash.put(5, 5); hash.put(6, 6); ...
在上述的`HashMapTest`类中,通过对比`keySet()`和`entrySet()`遍历HashMap的时间,我们可以看到`entrySet()`方法通常比`keySet()`方法更快。`keySet()`需要两次遍历:一次是转换为迭代器,另一次是从HashMap中根据...
1、遍历Map.entrySet():它的每一个元素都是Map.Entry对象,这个对象中, 放着的就是Map中的某一对key-value; 2、遍历Map.keySet():它是Map中key值的集合,我们可以通过遍历这个集合来 读取Map中的元素; 3、...
最后,HashMap是键值对存储的集合,遍历HashMap需要注意,因为直接遍历可能会出现并发修改异常。一般有两种方式:一是通过keySet()获取键的集合并遍历,二是通过entrySet()获取键值对的集合进行遍历: ```java ...
HashMap使用一个数组配合链表(JDK 1.8以后还引入了红黑树)来存储键值对。数组的长度通常设置为2的幂次,如16,这是因为通过位运算(&运算符)进行索引计算可以达到与取模运算相同的效果,但效率更高。当不同的键...