java遍历map方法
java 代码:
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- public class MapTest {
- public static void main(String[] args) {
- Map<String, String> map = new HashMap<String, String>();
- map.put("1", "1");
- map.put("2", "2");
- map.put("3", "3");
- // 第一种:通过Map.keySet遍历key和value
- System.out.println("通过Map.keySet遍历key和value:");
- for (String key : map.keySet()) {
- System.out.println("key= " + key + " and value= " + map.get(key));
- }
- // 第二种:通过Map.entrySet使用iterator遍历key和value
- System.out.println("通过Map.entrySet使用iterator遍历key和value:");
- Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry<String, String> entry = it.next();
- System.out.println("key= " + entry.getKey() + " and value= "
- + entry.getValue());
- }
- // 第三种:通过Map.entrySet遍历key和value
- System.out.println("通过Map.entrySet遍历key和value:");
- for (Map.Entry<String, String> entry : map.entrySet()) {
- System.out.println("key= " + entry.getKey() + " and value= "
- + entry.getValue());
- }
- // 第四种:通过Map.values()遍历所有的value,但是不能遍历键key
- System.out.println("通过Map.values()遍历所有的value:");
- for (String v : map.values()) {
- System.out.println("value= " + v);
- }
- }
- }
- 结果:
- 通过Map.keySet遍历key和value:
- key= 3 and value= 3
- key= 2 and value= 2
- key= 1 and value= 1
- 通过Map.entrySet使用iterator遍历key和value:
- key= 3 and value= 3
- key= 2 and value= 2
- key= 1 and value= 1
- 通过Map.entrySet遍历key和value:
- key= 3 and value= 3
- key= 2 and value= 2
- key= 1 and value= 1
- 通过Map.values()遍历所有的value:
- value= 3
- value= 2
- value= 1
这四种方法都可以遍历map:
第一种是目前许多人最喜欢的一种方式,因为代码最少,看起来最简单,通过遍历keySet,再将key所对应的value查询出来,这里有一个二次取值的过程,所以并不推荐;
第二种和第三种原理是相同的,都是通过遍历Map.Entry的方式,将Entry中的key和value打印出来,第三种是比较推荐写法,因为采用jdk1.5后的遍历形式,代码看起来比较整洁;
第四种比较少用,因为我们大多数时候都是同时需要key和value的
综上所述,如果map里面内容比较少,其实采用哪种方式都可以,第一种和第三种相对简洁一些;但是一旦容量非常大时,更推荐采用第三种方式,相比于第一种将极大地节省性能。
修改一下代码,对执行时间执行一下测试
- import java.util.HashMap;
- import java.util.Map;
- public class MapTest {
- static long MAX_LONG = 1000000L;
- static int TIMES = 10;
- static Map<String, String> map1 = new HashMap<String, String>();
- static Map<String, String> map2 = new HashMap<String, String>();
- static {
- for (long i = 0; i < MAX_LONG; i++) {
- map1.put("1" + i, "abc" + i);
- map2.put("2" + i, "def" + i);
- }
- }
- public static void main(String[] args) {
- String valueStr = "";
- String keyStr = "";
- long start, end;
- double totalMs;
- totalMs = 0;
- for (int i = 0; i < TIMES; i++) {
- // 通过Map.keySet遍历key和value
- start = System.currentTimeMillis();
- for (String key : map1.keySet()) {
- keyStr = key;
- valueStr = map1.get(key);
- }
- end = System.currentTimeMillis();
- System.out.println("通过Map.keySet遍历key和value耗时 " + (end - start)
- + " ms ");
- totalMs += (end - start);
- }
- System.out.println("Times : " + TIMES + ", totalMs : " + totalMs
- + "ms, average :" + totalMs / TIMES + "ms");
- }
- }
以下是测试结果:
- 通过Map.keySet遍历key和value耗时 186 ms
- 通过Map.keySet遍历key和value耗时 189 ms
- 通过Map.keySet遍历key和value耗时 87 ms
- 通过Map.keySet遍历key和value耗时 89 ms
- 通过Map.keySet遍历key和value耗时 84 ms
- 通过Map.keySet遍历key和value耗时 92 ms
- 通过Map.keySet遍历key和value耗时 85 ms
- 通过Map.keySet遍历key和value耗时 94 ms
- 通过Map.keySet遍历key和value耗时 89 ms
- 通过Map.keySet遍历key和value耗时 91 ms
- Times : 10, totalMs : 1086.0ms, average :108.6ms
- 通过Map.entrySet遍历key和value耗时 112 ms
- 通过Map.entrySet遍历key和value耗时 98 ms
- 通过Map.entrySet遍历key和value耗时 71 ms
- 通过Map.entrySet遍历key和value耗时 65 ms
- 通过Map.entrySet遍历key和value耗时 65 ms
- 通过Map.entrySet遍历key和value耗时 64 ms
- 通过Map.entrySet遍历key和value耗时 64 ms
- 通过Map.entrySet遍历key和value耗时 65 ms
- 通过Map.entrySet遍历key和value耗时 65 ms
- 通过Map.entrySet遍历key和value耗时 65 ms
- Times : 10, totalMs : 734.0ms, average :73.4ms 可以看出,百万级别的量时,使用keySet和entrySet遍历,执行时间大概为1.5:1,这并不是最主要的差异。真正的差异还是必须看代码
- map.get(key))
时执行的hash操作
- /**
- * Returns the value to which the specified key is mapped,
- * or {@code null} if this map contains no mapping for the key.
- *
- * <p>More formally, if this map contains a mapping from a key
- * {@code k} to a value {@code v} such that {@code (key==null ? k==null :
- * key.equals(k))}, then this method returns {@code v}; otherwise
- * it returns {@code null}. (There can be at most one such mapping.)
- *
- * <p>A return value of {@code null} does not <i>necessarily</i>
- * indicate that the map contains no mapping for the key; it's also
- * possible that the map explicitly maps the key to {@code null}.
- * The {@link #containsKey containsKey} operation may be used to
- * distinguish these two cases.
- *
- * @see #put(Object, Object)
- */
- 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;
- }
计算hashCode是CPU密集运算,非常耗费CPU资源,如果对一个比较大的map进行遍历,会出现CPU迅速飚高的现象,直接影响机器的响应速度,在多线程的情况下,简直就是一场灾难,而采用entrySet来进行遍历,则无此问题,对这个有兴趣的同学,可以使用自己的机器试一试。
java遍历map方法的更多相关文章
- java 遍历map 方法 集合 五种的方法
package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Itera ...
- Java遍历Map键、值。获取Map大小的方法
Map读取键值对,Java遍历Map的两种实现方法 第一种方法是根据map的keyset()方法来获取key的set集合,然后遍历map取得value的值 import java.util.HashM ...
- java 遍历map的方法
package com.jackey.topic; import java.util.ArrayList;import java.util.HashMap;import java.util.Itera ...
- java 遍历Map的四种方式
java 遍历Map的四种方式 CreationTime--2018年7月16日16点15分 Author:Marydon 一.迭代key&value 第一种方式:迭代entrySet 1 ...
- Java遍历Map对象的四种方法
在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHa ...
- java 遍历Map的4种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- JAVA遍历Map的方法
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestMap { pu ...
- java 遍历map的四种方法
16:21:42 Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项( ...
- java遍历map的四种方式
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
随机推荐
- (转)PHP中的ob_start用法详解
用PHP的ob_start();控制您的浏览器cache Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况.输出 ...
- archlinux的安装与简单配置(长期更新)
安装部分较为较为简略,详细内容请查看arch的wiki 分区 cfdisk 格式化 mkfs.ext4 /dev/sdaX ... 挂载分区 mount /dev/sdaX /mnt ... 修改软件 ...
- ios--UIButton简单使用
//这里创建一个圆角矩形的按钮 UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; /* 注:能 ...
- underscorejs-filter学习
2.6 filter 2.6.1 语法: _.filter(list, predicate, [context]) 2.6.2 说明: 对list集合的每个成员依次进行匹配(根据predicate迭代 ...
- (转)ligerUI 使用教程之Tip介绍与使用
概述: ligertip是ligerUI系列插件中的tooltip类插件,作用是弹一个浮动层,起提示作用 阅读本文要求具备jQuery的基本知识,不然文中的javascript代码不易理解 截 ...
- Windows下Apache部署Django过程记录
Win7/Apache/Python2.7/Django1.9部署Web 环境: Windows7 Apache httpd-2.4.16-win64-VC14 Python2.7.11 Djan ...
- 在win8.1 64位环境下有关Oracle的安装和卸载
1,Oracle安装 3 注意:在win8.1环境下安装64位的oracle客户端,注意配置是1g的 2.Oracle的卸载:http://jingyan.baidu.com/article/f7ff ...
- Linux Makefile多目录的编写
手头一个项目,需要编写项目的makefile 多目录结构: csource/ ├── common│ └── sqlite3├── inc│ ├── curl│ ├── lua│ └─ ...
- oracle insert &字符插入问题
例如执行一下语句: insert into NSRXT_SP (SP_ID, SP_TITLE, SP_DESC, SP_URL, SP_TYPE, SP_SUB_TYPE, ADD_TIME, CZ ...
- 使用Struts1完成用户登录功能
1.Struts框架 框架(framework):就是一系列代码和开发模式的整合,使用框架后,所有开发人员都会按照框架提供的规范进行开发,使代码更容易维护和扩展. 使用框架的优点: 1) 易于维护 ...