为了账号安全,请及时绑定邮箱和手机立即绑定

遍历HashMap

遍历HashMap

炎炎设计 2019-06-05 10:52:41
遍历HashMap在HashMap?
查看完整描述

3 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

如果您只对键感兴趣,则可以遍历keySet()地图:

Map<String, Object> map = ...;for (String key : map.keySet()) {
    // ...}

如果您只需要这些值,请使用values():

for (Object value : map.values()) {
    // ...}

最后,如果要同时使用键和值,请使用entrySet():

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Object value = entry.getValue();
    // ...}

请注意:如果要在迭代过程中删除项,则需要通过Iterator进行删除。

查看完整回答
反对 回复 2019-06-05
?
慕神8447489

TA贡献1780条经验 获得超1个赞

从引用中提取如何在Java中迭代Map:

有几种方法可以迭代Map在爪哇。让我们回顾一下最常用的方法,并回顾它们的优缺点。由于Java中的所有映射都实现了Map接口,所以以下技术将适用于任何地图实现(HashMapTreeMapLinkedHashMapHashtable等等)

方法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());}

请注意,for-each循环是在Java 5中引入的,因此该方法仅适用于新版本的语言。每个循环都会抛出NullPointerException如果您试图在一个为空的映射上迭代,那么在迭代之前,您应该始终检查空引用。

方法2:使用for-each循环迭代键或值。

如果只需要映射中的键或值,则可以迭代键集或值,而不是entrySet。

Map<Integer, Integer> map = new HashMap<Integer, Integer>();// Iterating over keys onlyfor (Integer key : map.keySet()) {
    System.out.println("Key = " + key);}// Iterating over values onlyfor (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);}

您也可以使用相同的技术来迭代。keySet或者价值观。

这种方法看起来可能是多余的,但它有自己的优点。首先,它是在旧版本的Java中迭代映射的唯一方法。另一个重要的特性是,它是允许您在迭代期间通过调用iterator.remove()..如果您在每次迭代中尝试这样做,您将得到“不可预测的结果”。

从性能的角度来看,此方法等于for-每一次迭代。

方法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的一个更干净的替代方案,但实际上它非常慢,而且效率很低,因为通过键获取值可能很费时(在不同的Map实现中,这种方法比方法1慢20%-200%)。如果安装了FindBugs,它将检测到这一点,并警告您注意效率低下的迭代。这种方法应该避免。

结论:

如果只需要映射中的键或值,请使用方法2。如果您使用了Java的旧版本(小于5),或者计划在迭代期间删除条目,则必须使用方法3。否则使用方法1。


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 478 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信