Java迭代keySet

17

我有以下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个回答

30

不要遍历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) {
    // ...
}

嗨Jesper,谢谢你的回答。顺便说一下,有两个语法错误(一个缺少“>”,另一个应该是entry而不是enty):-) +1并接受你的答案。 - Luixv

5

您正在获取所有键,然后在集合中搜索每个键。

使用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 + ")" );
      }

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

1

示例代码:

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

1

可能是因为您查询了两次地图:

  • 首先是键,
  • 其次是值

使用entryset迭代器将一次遍历整个地图。


0

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


0
嘿Luixv, 使用keyset迭代器不如使用entryset迭代器有效的原因是,第一种选项仍然需要使用Map.get(key)查找,而这在第二种选项中是避免的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接