您的位置:首页 > 编程语言 > Java开发

怎么在map上进行迭代(java)

2016-01-04 11:21 337 查看
在java中的map有很多种迭代方式,我们来看一下一些最常用的方式并且看一下他们的优点和缺点,因为java中的map都继承自Map接口,下边的接口适用于实现map接口的所有形式(HashMap、TreeMap、LinkedHashMap和HashTable等等)

方法一:在实体上使用for-each循环

这是在大多数情况下使用最常用的一种方式。如果你需要key和value的时候,可以使用这种方式。
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());
}


for-each循环是在java5之后引用的,所以你要使用它,一定要是新的版本才可以。如果在一个null的map上使用迭代的时候会抛出空指针异常,在使用它之前要检查它是否为空。

方法二:在keys或者values使用for-each循环。

如果你仅仅需要map的key或者value,你可以在keySet或者values进行迭代
Map<Integer, Integer> map = new HashMap<Integer, Integer>();

//在keys上迭代
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}

//在values进行迭代
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}


这种方法要比第一种方法快一些(大概快10%),并且更清晰

方法三:使用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);
}


我们可以在keySet或者values使用相同的技术。这个方法看起来非常的冗余但是也有他自己的优点。首先这是在java5之前的版本中唯一的迭代的方式。另一个重要的特点是你可以在迭代map的时候通过Iterator.remove()方法将实体在map集合中删除。如果你在for-each循环中这么做的话,可能会得到不可预知的结果。如果从性能的角度来看的话,它和for-each的性能差不多。

方法四:在keys上遍历(无效)

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);
}


这看起来比方法一要更清晰,但是实际上它非常的慢,如果你安装了FindBugs的话,它会检测到并且警告你这是一个无效的迭代,要避免使用这种方法。

总结

如果你只需要key或者value的时候,那马就使用方法二。如果你使用的是java的老的版本,或者在迭代的时候要移除元素的话,那就使用方法三,否则使用方法一。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: