怎么在map上进行迭代(java)
2016-01-04 11:21
337 查看
在java中的map有很多种迭代方式,我们来看一下一些最常用的方式并且看一下他们的优点和缺点,因为java中的map都继承自Map接口,下边的接口适用于实现map接口的所有形式(HashMap、TreeMap、LinkedHashMap和HashTable等等)
for-each循环是在java5之后引用的,所以你要使用它,一定要是新的版本才可以。如果在一个null的map上使用迭代的时候会抛出空指针异常,在使用它之前要检查它是否为空。
这种方法要比第一种方法快一些(大概快10%),并且更清晰
不使用泛型
我们可以在keySet或者values使用相同的技术。这个方法看起来非常的冗余但是也有他自己的优点。首先这是在java5之前的版本中唯一的迭代的方式。另一个重要的特点是你可以在迭代map的时候通过Iterator.remove()方法将实体在map集合中删除。如果你在for-each循环中这么做的话,可能会得到不可预知的结果。如果从性能的角度来看的话,它和for-each的性能差不多。
这看起来比方法一要更清晰,但是实际上它非常的慢,如果你安装了FindBugs的话,它会检测到并且警告你这是一个无效的迭代,要避免使用这种方法。
方法一:在实体上使用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的老的版本,或者在迭代的时候要移除元素的话,那就使用方法三,否则使用方法一。相关文章推荐
- leetcode 214:Shortest Palindrome 题目分析 与使用KMP算法的java实现
- Java常用类库--观察者设计模式( Observable类Observer接口)
- 网页抓取
- java 集合类研究
- java集合中:set与list相互转换
- eclipse 启动失败(找不到jvm)
- Java API —— 多线程
- Java设计模式_结构型_桥接模式_以不变应万变
- java通过原型创建对象真的比new创建对象快吗
- 基于FP-Tree的关联规则FP-Growth推荐算法Java实现
- (转)Java中equals和==的区别
- 基于FP-Tree的关联规则FP-Growth推荐算法Java实现
- Java避免空指针处理
- Java AQS源码分析
- java.lang.IllegalStateException: Fragment(XXFragment) not attached to Activity异常。
- java查询优化
- 【JAVA】虚拟机指令集
- struts 2 debug标签隐藏不显示
- JPA2.1 中三个提升应用性能的新功能
- idea 下java project 手动加载配置文件 file not found 问题