【问题标题】:Should I use an iterator to make a loop over HashMap?我应该使用迭代器在 HashMap 上进行循环吗?
【发布时间】:2011-05-22 02:44:59
【问题描述】:

我有一个HashMap<String,String>(称为p2p),我想对其元素进行循环。我找到了以下简单的方法:

for (String key : p2p.keySet()) {
   value = p2p.get(key);
}

然而,后来我发现人们使用iterator()。例如:

Iterator it = p2p.keySet().iterator();
while(it.hasNext()) {
    key = it.next();
    value = p2p.get(key);
}

对我来说,第一种方法看起来更简单。所以,我的问题是为什么人们使用第二种方式?它有一些客观的优势还是只是简单的品味和主观性的问题?

【问题讨论】:

    标签: java loops iterator hashmap


    【解决方案1】:

    它们是相同的 - enhanced for loop 使用迭代器来获取元素(除非您正在迭代一个数组,在这种情况下,它在后台使用长度和数组访问。)

    然而,就我个人而言,我不会那样迭代 - 我会迭代键/值对:

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

    这样您就无需进行任何实际查找。

    【讨论】:

      【解决方案2】:

      如果你想要键和元素,就去EntrySet:

      这是一个基本的例子:

      HashMap<String, Person> hm = new HashMap<String, Person>();
      
      hm.put("A", new Person("p1"));
      hm.put("B", new Person("p2"));
      hm.put("C", new Person("p3"));
      hm.put("D", new Person("p4"));
      hm.put("E", new Person("p5"));
      
      Set<Map.Entry<String, Person>> set = hm.entrySet();
      
      for (Map.Entry<String, Person> me : set) {
        System.out.println("Key :"+me.getKey() +" Name : "+ me.getValue().getName()+"Age :"+me.getValue().getAge());
      
      }
      

      【讨论】:

        【解决方案3】:

        我能想到的原因有几个,为什么可以使用第二种(显式迭代器)方式:

        1. “foreach 循环”仅在 Java 5 中引入,因此为较旧的 JVM 编写的代码不会这样。
        2. foreach 循环仅适用于简单(尽管很常见)的习惯用法,在这种习惯用法中您一次只处理一个元素。特别是,它不允许您查询通常有用的迭代器的 hasNext() 方法,或者执行一些将值对压缩到映射中的操作,等等。

        不过,就您的目的而言,您是对的,显式迭代器没有任何优势。

        【讨论】:

          【解决方案4】:

          第一种方法在 Java 语言中并不总是可行的。基本上是第二种方式的捷径。

          【讨论】:

            【解决方案5】:

            如果您想在迭代期间删除元素,则需要第二种(较旧的)方法,例如使用 Iterator.remove()。您不能在迭代期间使用 collection.remove() 从集合中删除元素 - 这会产生 ConcurrentModificationException。

            以上描述主要与集合(列表、集合)相关。

            【讨论】:

              【解决方案6】:

              使用第二种方法有两个原因:

              • 不知道存在增强的 for 循环。
              • 更强大 - 使用Iterator,您可以使用hasNext() 检查是否有更多元素,并且您可以在迭代列表时删除元素。

              【讨论】:

                【解决方案7】:

                如果你需要迭代值,那么做:

                for(String value: map.values(){
                   ...
                }
                

                如果您需要遍历键值对,请执行以下操作:

                for(Map.Entry<String, String> entry: map.entrySet()){
                   ... entry.getKey(); 
                   ... entry.getValue();
                }
                

                请记住,当您想在迭代期间从集合中删除某些内容时,您必须使用显式迭代器(而不是 foreach)。

                【讨论】:

                  猜你喜欢
                  • 2014-04-27
                  • 2014-04-27
                  • 2019-07-28
                  • 2013-11-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-02-20
                  • 2014-10-31
                  相关资源
                  最近更新 更多