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

在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的老的版本,或者在迭代的时候要移除元素的话,那就使用方法三,否则使用方法一。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值