【问题标题】:Which one is better to iterate through each entry in HashMap? [duplicate]哪一个更好地遍历HashMap中的每个条目? [复制]
【发布时间】:2017-11-13 09:29:46
【问题描述】:

我有两种方法可以遍历 hashmap 中的每个条目,你能解释一下哪一个比其他更受欢迎吗?为什么?

HashMap m = new HashMap();
m.put("A",100);
m.put("B",100);
m.put("C",100);
m.put("D",100);

一种迭代方式

Set s1 = m.entrySet();
Iterator itr = s1.iterate();
while(itr.hasNext()) {
Map.Entry m1 = (Map.Entry)s1.next();
System.out.println(m1.getKey()+"..."+m1.getValue);
}

第二种迭代方式

Set<Map.Entry<String,Integer>> s1 = m.entrySet();
for(Map.Entry<String,Integer> m1:s1){
System.out.println(m1.getKey()+"..."+m1.getValue); 
}

【问题讨论】:

  • 我更喜欢第二个。它可以让你安全地打字等等。但我没有证据证明它表现得更好等等。
  • 请更正第一种方式的代码,使差异集中在主要方面例如:for (Iterator&lt;Map.Entry&lt;String, Integer&gt;&gt; itr = m.entrySet().iterator();itr.hasNext();) {Map.Entry elem = itr.next();System.out.println(elem.getKey() + "..." + elem.getValue());}

标签: java dictionary collections


【解决方案1】:

两者基本相同(除了第一个 sn-p 中的原始类型 - 如果您使用显式 Iterator,则没有理由使用原始 SetIteratorMap.Entry - 使用 @ 987654325@、Iterator&lt;Map.Entry&lt;String,Integer&gt;&gt;Map.Entry&lt;String,Integer&gt;)。

增强的 for 循环在幕后创建了一个 Iterator

但是,如果您希望在对其进行迭代时从 Set 中删除元素,则必须使用显式的 Iterator(以及 Iteratorremove() 方法)。

此外,在第一个 sn-p 中,您可以合并前两个语句 - Iterator&lt;Map.Entry&lt;String,Integer&gt;&gt; itr = m.entrySet().iterator(); - 因为您不需要 Set 引用。

【讨论】:

    【解决方案2】:

    注意:为了更简单地比较真正的差异,我重写了代码

    如果您只想处理忘记它们属于容器的元素...... 第二种方式更好,因为更简洁,更清晰易读

    for (Map.Entry<String,Integer> elem : m.entrySet()) {
      System.out.println(elem.getKey() + "..." + elem.getValue()); 
    }
    

    但是,如果您需要对容器结构本身进行操作(例如,添加、删除元素)...第一种方式是正确的

    for (Iterator<Map.Entry<String, Integer>> itr = m.entrySet().iterator(); 
         itr.hasNext();) { 
      Map.Entry<String, Integer> elem = itr.next(); 
      System.out.println(elem.getKey() + "..." + elem.getValue());  
    }
    

    【讨论】:

      【解决方案3】:

      它们是等价的,所以我肯定更喜欢第二种,因为它更简单,而且速度更快(尽管可能很难注意到)。

      我会进一步简化它:

      for(Map.Entry<String,Integer> m1 : s1.entrySet()){
        System.out.println(m1.getKey() + "..." + m1.getValue); 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多