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
- map.get(key))
- 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来进行遍历,则无此问题,对这个有兴趣的同学,可以使用自己的机器试一试。
相关推荐
### 二、使用keySet遍历Map `Map`提供了一个`keySet()`方法,该方法返回`Map`中所有键的集合视图。通过这个方法,我们可以获取到一个包含所有键的`Set`集合,然后使用迭代器(`Iterator`)或增强型for循环(foreach...
遍历MAP的几种方法,利用keyset进行遍历,它的优点在于可以根据你所想要的key值得到你想要的 values,更具灵活性
本文将详细讲解两种主要的遍历Map元素的方法,并分析它们的效率差异。 ### 方法一:通过`entrySet()`遍历 这是推荐的遍历Map元素的方式,因为它具有较高的效率。通过调用`Map.entrySet()`方法,我们可以获取到Map...
在Java编程中,Map接口是用于存储键值对的数据结构,它提供了多种遍历Map的方法。本篇文章将详细分析Java中遍历Map的四种常见方法,帮助开发者更好地理解和运用这些技巧。 1. **for-each循环遍历** Java 5引入了...
### Java遍历Map对象的所有数据 在Java编程中,`Map`接口是Java集合框架中的一个关键组成部分,它用于存储键值对。本篇文章将详细解释如何遍历`Map`对象的所有数据,并介绍几种常见的遍历方法。我们将重点讨论通过`...
#### 一、使用Iterator遍历Map 1. **通过`entrySet()`获取迭代器** 使用`Map.entrySet()`方法可以返回`Map`中所有映射关系的`Set`视图,然后可以通过迭代这个`Set`来遍历整个`Map`。 ```java Map, String> ...
Map是一种常用的数据结构,在Java中有多种遍历Map的方式。今天,我们来讨论一种遍历Map的方式,即使用Map.Entry和Map.entrySet()。 Map.Entry是什么? ---------------- Map.Entry是一个接口,表示一个映射项,...
### Java遍历JSON树知识点详解 #### 一、前言 在处理Web应用程序中的数据时,JSON(JavaScript Object Notation)是一种非常常见的数据格式。它轻量级且易于读写,因此广泛应用于前后端的数据交互中。对于Java...
以下是Java中遍历Map的几种常见方法,包括使用增强的for循环、迭代器以及通过keySet()和entrySet()方法: 1. **增强的for循环(foreach)** 增强的for循环是Java 5引入的新特性,它可以简洁地遍历集合。对于Map,...
本文将详细探讨在Java中遍历`Map`的两种常用方法:通过`keySet()`方法和通过`entrySet()`方法。 ### 一、通过`keySet()`方法遍历`Map` #### 方法概述 `keySet()`方法返回一个包含`Map`中所有键的`Set`视图。通过...
### Map遍历的四种方法 在Java编程语言中,`Map`是一种常用的数据结构,用于存储键值对。为了能够有效地处理和操作这些键值对数据,熟练掌握遍历`Map`的方法至关重要。本文将详细介绍四种不同的遍历`Map`的方式,并...
主要提供java中的map的遍历实例及效率比较
在Java编程中,集合框架是处理数据的重要...总之,Java中遍历Map有多种方法,具体选择取决于你的需求。使用`entrySet()`、`keySet()`或`values()`,配合迭代器或增强的for循环,都可以方便地访问和操作Map中的键值对。
两种方法都可以用于遍历Map集合,但是它们之间有一些区别。在实际开发中,我们可以根据实际情况选择合适的遍历方法。 优点和缺点 使用values()方法和Iterator迭代器的优点: * 该方法能够快速地遍历Map集合中的...
1、遍历Map.entrySet():它的每一个元素都是Map.Entry对象,这个对象中, 放着的就是Map中的某一对key-value; 2、遍历Map.keySet():它是Map中key值的集合,我们可以通过遍历这个集合来 读取Map中的元素; 3、...
"java 遍历Map及Map转化为二维数组的实例" 在 Java 编程语言中,遍历 Map 及将其转化为二维数组是一种常见的操作。本文将详细介绍如何使用 Java 遍历 Map 及将其转化为二维数组,并提供实例代码以供参考。 1. 使用...
总结一下,Java中遍历Map主要有两种方法:通过`keySet()`遍历键并获取值,或通过`entrySet()`直接遍历键值对。获取Map大小则简单地调用`size()`方法即可。这些基本操作对于理解和使用Map数据结构至关重要,无论是在...
这篇博文主要探讨了如何遍历Java中的`Map`对象,下面将详细介绍几种常见的遍历`Map`的方法。 1. **迭代器法**: Java提供了`Map`接口的`entrySet()`方法,返回一个包含`Map`中所有键值对的`Set`视图。通过这个`Set...
本文将详细介绍Java中Map集合的三种遍历方法及其应用场景、优缺点等,帮助读者更好地理解和掌握Map的使用技巧。 ### 一、Map简介 `Map`接口是Java集合框架的一部分,它提供了基于键值对的数据存储方式。常见的实现...