15

我有以下 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列表只计算一次。任何意见?谢谢。

4

7 回答 7

29

与其迭代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
}

这样您就不必在地图中查找每个键;直接一键获取key和value。

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

public void myMethod (final Map<String, List<FeatureKey>> pFeatureGroupsFromPackage) {
    // ...
}
于 2011-03-25T09:57:41.537 回答
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 + ")" );
      }
于 2011-03-25T09:56:27.003 回答
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);
}
于 2014-08-04T09:29:33.497 回答
1

可能是您两次查询地图:

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

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

于 2011-03-25T09:58:14.710 回答
1

示例代码:

for (Map.Entry < Integer, List < FeatureKey >>> i: map.entrySet()) {
    System.out.println(i.getValue() + " " + i.getKey()));
}
于 2015-04-07T08:38:41.487 回答
0

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

于 2011-03-25T09:59:50.307 回答
0

嘿 Luixv,使用 keyey 迭代器不如 entryset iteratot 有效的原因是,使用第一个选项您仍然必须使用第二个选项避免的 Map.get(key) 查找。

于 2011-03-25T10:01:47.673 回答