HashMap 遍历的两种方式及性能比较
HashMap 是Java开发中经常使用的数据结构。相信HashMap 的基本用法你已经很熟悉了。那么我们该如何遍历HashMap 呢?哪种遍历方式的性能更好呢?本篇文章来为你解决这个疑惑。
一、HashMap 遍历
如果你了解一些HashMap 底层原理,那么你肯定知道HashMap 是一个存储键值对的集合,每个键值对叫Entry。Entry 组成的数组构成了整个HashMap 的主干。Entry 的索引是通过Hash()方法计算出来的。因此Entry在数组内部是无序的(所以我们不能单纯的用for语句有序遍历)。那么我们该如何遍历HashMap 呢?
1. 使用EntrySet遍历
HashMap 的内部有一个EntrySet方法可以让我们方便地获取HashMap 数组内的所有Entry。假设我们有一个这样的HashMap。
HashMap<String,Integer> map=new HashMap<String,Integer>();
我们可以这样获取EntrySet。
Set<Entry<String, Integer>> entrySet=map.entrySet();
这样就得到了HashMap 中所有的Entry。获取Entry 之后遍历就简单多了。我们可以用foreach 语句遍历
Set<Entry<String, Integer>> entrySet=map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
或者使用迭代器的方式:
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
System.out.println(entry.getKey()+":"+entry.getValue());
}
2.使用KeySet 遍历
HashMap 中的KeySet方法可以将把Map中所有的键存入到set集合中。再根据get方法,就可以获取到每一个键对应的值。 使用KeySet 遍历的代码如下:
for (String key : map.keySet()) {
System.out.println(key+":"+map.get(key));
}
补充一点,如果你想获取Hashmap 中所有的value,你可以用values 方法。该方法返回一个包含所有value 的collection。
Collection<String> collection = map.values();
System.out.println(collection);
二、性能比较
网上对这两种遍历方法进行性能比较的文章有很多,我在此就不详细比较了。结论就是,使用EntrySet (也就是第一种方式)进行遍历的性能更好,无论你是使用foreach还是迭代器,只要你用的是EntrySet 的方式就可以。而KeySet的方式性能就很差,至于KeySet为什么性能很差,我们可以看看遍历KeySet 时用到的get() 方法的源码(JDK 1.6 ver)。
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;
}
可以看出来,源码先获取了key 对应的hash值 ,然后根据hash值在HashMap 的Entry 数组内遍历出hash值与key的hash值相等的Entry,并返回对应的Value。所以get() 方法在获取Value 的时候又进行了一次循环,这导致了性能的下降。
三、总结
总结一下,我们介绍了两种遍历HashMap 的方法,一种是用EntrySet,另一种是用KeySet。性能上EntrySet 优于KeySet ,这是因为KeySet 的get方法在获取Value 的时候需要进行遍历。所以推荐遍历HashMap 的时候使用EntrySet 的方法。
HashMap 遍历的两种方式及性能比较的更多相关文章
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- [Java] HashMap遍历的两种方式
Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种: Map map = new HashMap( ...
- HashMap遍历的两种方式
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { ...
- HashMap遍历的两种方式,推荐使用entrySet()
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { ...
- python中字典的循环遍历的两种方式
开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...
- C++ 数组遍历的两种方式
C++ 数组遍历的两种方式: #include <iostream> using namespace std; int main() { // 一维数组 ] = {, , , , }; / ...
- Java中HashMap遍历的两种方法(转)
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...
- php对数组遍历的两种方式示例
在对 php 数组遍历时,一般经常使用 foreach 来遍历,很少用 while 来遍历,在下面的代码中作一个对比. <?php $content = ["ID" => ...
- 【React】遍历的两种方式
1.foreach(推荐) list.forEach((item)=>{ }); eg: dataSource.forEach((item) => { const est = item.e ...
随机推荐
- 【Mysql】 case ... when ... 用法
sql语句查询时给某个空字段赋值 SELECT CASE WHEN field= '' THEN ' WHEN fieldIS NULL THEN ' ELSE field END FROM tabl ...
- 开源的PaaS方案:在OpenStack上部署CloudFoundry (三)部署BOSH
BOSH是CloudFoundry提供的用来安装部署和升级CloudFoundry的自动化工具,可是说是CloudFoundry的一部分.总体来说,BOSH是Client/Server结构, BOSH ...
- 【Linux系列】find命令使用
Linux下find命令在目录结构中搜素文件,病执行制定的操作. 一.命令格式 find pathname -options[-print -exec -ok] 二.命令功能 用于在文件树种查找文件, ...
- javascript:;禁用a标签默认功能的缺点。
在使用a标签做切换tab或者其他功能时,经常使用javascript:;来作为a标签的href来使用. 缺点: 1.在js尚未加载的情况下,点击该a标签会弹出新窗口. 2.会使gif动画失效(没经历过 ...
- Egret打包App 短暂黑屏解决方案 (Egret4.1.0)
论坛已经有人解决:http://bbs.egret.com/forum.php?mod=viewthread&tid=30288&highlight=app%2B%E9%BB%91%E ...
- 【BZOJ5008】方师傅的房子 三角剖分
[BZOJ5008]方师傅的房子 Description 方师傅来到了一个二维平面.他站在原点上,觉得这里风景不错,就建了一个房子.这个房子是n个点的凸多边形,原点一定严格在凸多边形内部.有m个人也到 ...
- spring全局变量引起的并发问题
先看下面小段代码,一个controller,一个service. controller.java代码: ........ @Autowired private XXXService ...
- shell用curl抓取页面乱码,参考一下2方面(转)
1.是用curl抓取的数据是用类似gzip压缩后的数据导致的乱码.乱码:curl www.1ting.com |more乱码:curl -H "Accept-Encoding: gzip&q ...
- 徐州网络赛A-Hard To Prepare【dp】【位运算】【快速幂】
After Incident, a feast is usually held in Hakurei Shrine. This time Reimu asked Kokoro to deliver a ...
- Kafka集群部署 (守护进程启动)
1.Kafka集群部署 1.1集群部署的基本流程 下载安装包.解压安装包.修改配置文件.分发安装包.启动集群 1.2集群部署的基础环境准备 安装前的准备工作(zk集群已经部署完毕) 关闭防火墙 c ...