java中map怎么遍历
在Java中如何遍历Map对象
How to Iterate Over a Map in Java
在java中遍历Map有不少的方法。我们看一下最常用的方法及其优缺点。
既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等)
方法一 在for-each循环中使用entries来遍历
这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。
[java] view plain copy
Map map = new HashMap();
for (Map.Entry entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
注意:for-each循环在java 5中被引入所以该方法只能应用于java 5或更高的版本中。如果你遍历的是一个空的map对象,for-each循环将抛出NullPointerException,因此在遍历前你总是应该检查空引用。
方法二 在for-each循环中遍历keys或values。
如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。
[java] view plain copy
Map map = new HashMap();
//遍历map中的键
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
//遍历map中的值
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
该方法比entrySet遍历在性能上稍好(快了10%),而且代码更加干净。
方法三使用Iterator遍历
使用泛型:
[java] view plain copy
Map map = new HashMap();
Iterator> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
不使用泛型:
[java] view plain copy
Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = " + key + ", Value = " + value);
}
你也可以在keySet和values上应用同样的方法。
该种方式看起来冗余却有其优点所在。首先,在老版本
java中这是惟一遍历map的方式。另一个好处是,你可以在遍历时调用iterator.remove()来删除entries,另两个方法则不能。根
据javadoc的说明,如果在for-each遍历中尝试使用此方法,结果是不可预测的。
从性能方面看,该方法类同于for-each遍历(即方法二)的性能。
方法四、通过键找值遍历(效率低)
[java] view plain copy
Map map = new HashMap();
for (Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key = " + key + ", Value = " + value);
}
作为方法一的替代,这个代码看上去更加干净;但实际上它相当慢且无效率。因为从键取值是耗时的操作(与方法一相比,在不同的Map实现中该方法慢了20%~200%)。如果你安装了FindBugs,它会做出检查并警告你关于哪些是低效率的遍历。所以尽量避免使用。
java Map 怎么遍历
关于java中遍历map具体有四种方式,请看下文详解。1、这是最常见的并且在大多数情况下也是最可取的遍历方式,在键值都需要时使用。Map map = new HashMap();for (Map.Entry entry : map.entrySet()) {System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}2、在for-each循环中遍历keys或values。如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。Map map = new HashMap();for (Integer key : map.keySet()) {System.out.println("Key = " + key);}for (Integer value : map.values()) {System.out.println("Value = " + value);}该方法比entrySet遍历在性能上稍好(快了10%),而且代码更加干净。3、使用Iterator遍历使用泛型:Map map = new HashMap();Iterator> entries = map.entrySet().iterator();while (entries.hasNext()) {Map.Entry entry = entries.next();System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());}不使用泛型:Map map = new HashMap();Iterator entries = map.entrySet().iterator();while (entries.hasNext()) {Map.Entry entry = (Map.Entry) entries.next();Integer key = (Integer)entry.getKey();Integer value = (Integer)entry.getValue();System.out.println("Key = " + key + ", Value = " + value);}4、通过键找值遍历(效率低)Map map = new HashMap();for (Integer key : map.keySet()) {Integer value = map.get(key);System.out.println("Key = " + key + ", Value = " + value);}假设Map中的键值对为1=>11,2=>22,3=>33,现用方法1来遍历Map代码和调试结果如下:扩展资料:1、HashMap的重要参数HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。在Java编程语言中,加载因子默认值为0.75,默认哈希表元为101。2、HashMap的同步机制注意,此实现不是同步的。 如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系的任何操作;以防止对映射进行意外的非同步访问,如下:Map m = Collections.synchronizedMap(new HashMap(...));参考资料:百度百科-Hashmap
如何高效的遍历Map?你常用的不一定是最快的
如文章标题所言,遍历Map是开发过程中比较常见的行为,实现的方式也有多种方式,本文带领大家一起看看更加高效的遍历 Map 。 首先一起来看看,有哪些遍历 Map 的方式 这种应该算是比较常见的使用方式,也是比较容易理解的 keySet : 获取 map 中所有的 key ,然后依次遍历每个 key 。 这种是我平时开发中用的最多的方式,简单通俗易懂。 但是其性能如何呢?后续待揭秘。 不知道有多少人用过 Java8 中的 parallel模式,本质是一种并行处理方式。 性能如何?稍后揭晓。 不行就找找外援试试? 测试环境如下:Intel i7-4790 3.60 GHz, 16 GB 测试集为小的Map集合(大约100个元素),各个方法耗时如下: 从结果看出,在数据量比较小时, 利用 Java 8中的foreach 暂时领先。 测试集为元素数据量 1000 的 Map 集合,测试结果如下: 从结果集合看,在中等数据量情况下,外援 Eclipse (CS) collections 中的 MutableMap 表现最为优异,勇得第一。 其次为 Java 8 中的 foreach ,位列第二。 测试集为元素数据量 100000 (十万级别) 的 Map 集合,测试结果如下: 利用 iterator 和 Map.Entry 【方法1】稳居第一,领先 第二名差不多7s。 第二名为 Eclipse (CS) collections 中的 MutableMap 位列第二,在大数据量下表现表现比较出色。 指的注意的是之前在小数据量下表现比较出色的 Java 8 中的 foreach ,排名却比较靠后,但是仍然超过了利用 Java8 的 Stream API 。 其中还有另一个现象:利用并行模式计算的 Java8 中的 Stream API parallel ,在大数据量时表现好于 foreach 和 stream api 。 下表为不同数据量情况下的各个方法性能表现 在平时开发中,数据量都不算太大时,剖除外援而言, Java 8 中的 foreach 【方法3】,表现比较优异。而并行运算的 Stream API parallel 【方法8】表现没有想象中好, Stream API 【方法7】表现中规中矩。 主要罗列了多种遍历 Map 的方式,每个实现方式都有各自的特点,有的人喜欢 foreach 的通俗易懂;有的人喜欢 stream 的干净利落。 如果从性能来看,小数据量情况下:优先推荐使用 Java8 Foreach 【方法3】。 大数据量情况下推荐 使用 iterator 和 Map.Entry 【方法1】。 我是大黄,一个只会写 HelloWorld 的程序员,下期见。
java Map 怎么遍历
java Map 遍历一般有四种方式方式一: 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。方式二: 在for-each循环中遍历keys或values。如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。该方法比entrySet遍历在性能上稍好(快了10%),而且代码更加干净。方式三:使用Iterator遍历使用泛型:不使用泛型:你也可以在keySet和values上应用同样的方法。方法四: 通过键找值遍历(效率低)作为方法一的替代,这个代码看上去更加干净;但实际上它相当慢且无效率。因为从键取值是耗时的操作(与方法一相比,在不同的Map实现中该方法慢了20%~200%)。如果安装了FindBugs,它会做出检查并警告你关于哪些是低效率的遍历。所以尽量避免使用。总结:如果仅需要键(keys)或值(values)使用方法二。如果所使用的语言版本低于java 5,或是打算在遍历时删除entries,必须使用方法三。否则使用方法一(键值都要)。扩展资料:类似的遍历算法:二叉树的遍历算法1、先(根)序遍历的递归算法定义:若二叉树非空,则依次执行如下操作:⑴ 访问根结点;⑵ 遍历左子树;⑶ 遍历右子树。2、中(根)序遍历的递归算法定义:若二叉树非空,则依次执行如下操作:⑴遍历左子树;⑵访问根结点;⑶遍历右子树。3、后(根)序遍历得递归算法定义:若二叉树非空,则依次执行如下操作:⑴遍历左子树;⑵遍历右子树;⑶访问根结点。参考资料:百度百科——Java