在的Java中有多种遍历HashMap中的方法让我们回顾一下最常见的方法和它们各自的优缺点由于所有的地图都实现了地图接口,所以接下来方法适用于所有地图(如:。HaspMap,TreeMap的,LinkedMap,哈希表,等等)

方法#1使用For-Each迭代条目

这是最常见的方法,并在大多数情况下更可取的。当你在循环中需要使用地图的键和值时,就可以使用这个方法

Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for(Map.Entry<Integer, Integer> entry : map.entrySet()){ System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue()) } 

注意:对于-每个循环是Java5中新引入的,所以只能在Java5的以上的版本中使用如果你遍历的地图是空的话,对于-每个循环会抛出的NullPointerException异常,所以在遍历之前你应该判断是否。为空引用。

方法#2使用For-Each迭代键和值

如果你只需要用到地图的键或值时,你可以遍历密钥集或者值代替的entrySet

Map<Integer, Integer> map = new HashMap<Integer, Integer>(); //iterating over keys only for (Integer key : map.keySet()) { System.out.println("Key = " + key); } //iterating over values only for (Integer value : map.values()) { System.out.println("Value = " + value); } 

这个方法比的entrySet迭代具有轻微的性能优势(大约快10%)并且代码更简洁

方法#3使用Iterator迭代

使用泛型

Map<Integer, Integer> map = new HashMap<Integer, Integer>(); Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry<Integer, Integer> 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); } 

你可以使用同样的技术迭代键集或者值

这个似乎有点多余但它具有自己的优势。首先,它是遍历老的java版本地图的唯一方法。另外一个重要的特性是可以让你在迭代的时候从地图中删除条目的(通过调用iterator.remover( ))唯一方法。如果你试图在For-Each迭代的时候删除条目,你将会得到不可预测的结果异常。

从性能方法看,这个方法等价于使用的for-each迭代

方法#4迭代键和搜索值(低效的)

Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Integer key : map.keySet()) { Integer value = map.get(key); System.out.println("Key = " + key + ", Value = " + value); } 

这个方法看上去比方法#1更简洁,但是实际上它更慢更低效,通过键得到值值更这个方法在所有实现映射接口的地图中耗时(比方法#1慢20%-200% )。如果你安装了FindBugs的,它将检测并警告你这是一个低效的迭代。这个方法应该避免

总结

如果你只需要使用key或者值使用方法#2,如果你坚持使用java的老版本(java 5以前的版本)或者打算在迭代的时候移除条目,使用方法#3。其他情况请使用#1方法。避免使用#4方法。