文档章节

Java中的HashMap的2种遍历方式比较

乐在克里特
 乐在克里特
发布于 2017/02/24 13:45
字数 362
阅读 8
收藏 0

首先我们准备数据,准备一个map

Map<String, String> map = new HashMap<String, String>();  
for (int i = 0; i < 10; i++) {  
    map.put(i + "", "value" + i);  
}

 

然后我们采用传说中的key遍历: 步骤:先弄成key set,然后遍历key set 通过key从map中获取value

Iterator<String> iterator = map.keySet().iterator();  
while (iterator.hasNext()) {  
    String key = iterator.next();  
    String val = map.get(key);  
    System.out.println(key + "->" + val);  
}  
System.out.println("*********************");

 

然后我们在采用entrySet的方式遍历下:

步骤:先弄成entrySet 然后遍历他,获取key和value

Set<Entry<String, String>> set = map.entrySet();  
Iterator<Entry<String, String>> s = set.iterator();  
while (s.hasNext()) {  
    Entry<String, String> en = s.next();  
    String key = en.getKey();  
    String val = en.getValue();  
    System.out.println(key + "->" + val);  
}

 

孰优孰劣? 看JDK源码,对比两种访问方式:

首先看KeySet访问方式:

public Set<K> keySet() {  
if (keySet == null) {  
    keySet = new AbstractSet<K>() {  
    public Iterator<K> iterator() {  
        return new Iterator<K>() {  
        private Iterator<Entry<K,V>> i = entrySet().iterator();  

        public boolean hasNext() {  
            return i.hasNext();  
        }  

        public K next() {  
            return i.next().getKey();  
        }  

        public void remove() {  
            i.remove();  
        }  
                   };  
    }  
    public int size() {  
        return AbstractMap.this.size();  
    }  

    public boolean contains(Object k) {  
        return AbstractMap.this.containsKey(k);  
    }  
    };  
 }  
return keySet;  
}

 

也就是调用entrySet()从entryset中获取key,也就是说是在entry set的基础上来做的,貌似多次一举

结论:

通过上述代码我们就知道,采用entrySet方式要优于keySet,因为keySet首先要访问entrySet来组建一个keySet,重复工作不言而喻。

所以使用entrySet的效率更高些,或许很多时候我们都不太注意这些,但是从源码中就可以得到答案了。

 

http://outofmemory.cn/code-snippet/1508/HashMap-2-zhong-bianli-mode-match

© 著作权归作者所有

共有 人打赏支持
乐在克里特
粉丝 16
博文 268
码字总数 394729
作品 0
杭州
程序员
私信 提问
-Java forEach中 Lambda Expr中的 final变量要求

本文是关于 -Java Lambda Expression在forEach方法的应用讨论。对比其他编程语言的foreach 操作(文末附带7种主要编程语言的Loop HashMap by forEach的程序片段),Java 8引入的运用 Lambda E...

wadelau
07/19
0
0
Stack Overflow 上人气爆表的10个 Java 问题

1、 为什么两个(1927年)时间相减得到一个奇怪的结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较: 1 2 3 4 5 6 7 8 9 10 输出是: 1 为什么 ld4-ld3 不是...

AlexMahoneFBI
2015/11/13
0
0
4 种 HashMap 中对象遍历的方法

使用 Java 5 的 foreach 进行迭代和循环 输出结果 ------------------------------------------------ Iterating or looping map using java5 foreach looop key: name value: oschina -----......

红薯
2012/03/16
1K
3
java.util包中集合详解

本文只是集合的概述,介绍集合之间的关系,以及各种集合的异同,不会深入介绍具体的实现,具体实现的介绍,可以参见文中提供的链接。 java集合概述 java集合整体分为collection和map两种,接...

jacksu在简书
01/25
0
0
《阿里巴巴 Java开发手册》读后感

只有光头才能变强 前一阵子一直在学Redis,结果在黄金段位被虐了,暂时升不了段位了,每天都拿不到首胜(好烦)。 趁着学校校运会,合理地给自己放了一个小长假,然后就回家了。回到家才发现当...

Java3y
11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

NPM install -save 和 -save-dev 傻傻分不清

本文原文地址:https://www.limitcode.com/detail/59a15b1a69e95702e0780249.html 回顾 npm install 命令 最近在写Node程序的时候,突然对 npm install 的-save和-save-dev 这两个参数的使用...

翔飘飘
5分钟前
0
0
spring-boot:run启动时,指定spring.profiles.active

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active,则必须使用mvn spring-boot:run -Drun.profiles=test......

颖辉小居
5分钟前
0
0
抛弃console.log(),拥抱浏览器Debugger

译者按: 切换成本真的不高,建议使用开发者工具来Debug! 原文:How to stop using console.log() and start using your browser’s debugger 译者: Fundebug 为了保证可读性,本文采用意译...

Fundebug
9分钟前
0
0
Flask框架web开发:零基础入门

Flask框架是Python开发的一个基于Werkzeug和Jinja 2的web开发微框架,它的优势就是极其简洁,但又非常灵活,而且容易学习和应用。因此Flask框架是Python新手快速开始web开发最好的选择,此外...

笔阁
22分钟前
5
0
VMware前路难测,多个厂家群雄逐鹿

在人们高谈Salesforce、亚马逊等新兴云计算厂商取得的成就时,以VMware、HPE和Cisco为代表的老牌厂商也在进行着自己的转型和变化,而且还取得一定的进展。以VMware为例,虚拟机巨头公布了第二...

linuxCool
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部