密钥集上的Java迭代

时间:2011-03-25 09:54:06

标签: java optimization iteration keyset

我有以下Java代码:

public void myMethod (final Map pFeatureGroupsFromPackage) {

   final Set<String> keys = pFeatureGroupsFromPackage.keySet();

   for (final String key : keys) {
           tmpList = (List<FeatureKey>) pFeatureGroupsFromPackage.get(key);
    // do whatever
   }
}

我从“findBugs”收到警告,告诉以下内容:

方法myMethod无效地使用keySet迭代器而不是entrySet迭代器。 警告是在tmpList分配时完成的。

我不明白为什么这样效率低下。事实上,keys列表只计算一次。 任何意见?感谢。

7 个答案:

答案 0 :(得分:24)

不是迭代keySet并调用get来获取每个键的相应值,而是遍历entrySet

final Set<Map.Entry<String, List<FeatureKey>>> entries = pFeatureGroupsFromPackage.entrySet();

for (Map.Entry<String, List<FeatureKey>> entry : entries) {
    String key = entry.getKey();
    List<FeatureKey> tmpList = entry.getValue();

    // do whatever
}

这样您就不必在地图中查找每个键;你可以一次性获得关键和价值。

另外,使用类型参数声明您的Map

public void myMethod (final Map<String, List<FeatureKey>> pFeatureGroupsFromPackage) {
    // ...
}

答案 1 :(得分:4)

您获得所有密钥,然后搜索集合中的每个密钥

Map.EntrySet迭代会更快,一个小例子:

但你也应该使用泛型......

Set entries = map.entrySet();
      Iterator entryIter = entries.iterator();
      System.out.println("The map contains the following associations:");
      while (entryIter.hasNext()) {
         Map.Entry entry = (Map.Entry)entryIter.next();
         Object key = entry.getKey();  // Get the key from the entry.
         Object value = entry.getValue();  // Get the value.
         System.out.println( "   (" + key + "," + value + ")" );
      }

答案 2 :(得分:4)

这可以帮到你:

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);
}

答案 3 :(得分:0)

可能是您要两次查询地图:

  • 首先是钥匙,
  • 和第二个值

使用entryset迭代器将迭代地图一次。

答案 4 :(得分:0)

通过keySet迭代器访问HashMap比在TreeMap上使用keySet迭代器更快。

答案 5 :(得分:0)

嘿Luixv, 使用keysey迭代器的原因不如entryset iteratot有效,第一个选项仍然需要使用Map.get(key)lookeup,而第二个选项则避免使用。

答案 6 :(得分:0)

示例代码:

for (Map.Entry < Integer, List < FeatureKey >>> i: map.entrySet()) {
    System.out.println(i.getValue() + " " + i.getKey()));
}