2011-03-25 122 views
10

我有以下的Java代码:的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列表仅计算一次。 有何评论?谢谢。

回答

23

相反遍历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) { 
    // ... 
} 
+0

嗨加斯帕。感谢您的回答。顺便说一句,有两个语法错误(一个缺少'>',它应该是入口而不是物质):-) +1并且为你接受 – Luixv 2011-03-25 10:15:39

+0

@Luixv谢谢,修正了错别字。 – Jesper 2011-03-25 13:09:51

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

这可能是因为你两次查询地图: - 第一的钥匙, - 和第二的价值观

使用入口集迭代器将在地图上迭代一次。

0

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

0

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

3

这可以帮助你:

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

示例代码:

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