密钥集上的Java迭代

Lui*_*ixv 13 java iteration optimization 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
   }
}
Run Code Online (Sandbox Code Playgroud)

我收到"findBugs"的警告,告诉您:

方法myMethod使得无效地使用keySet迭代器而不是entrySet迭代器.警告在tmpList作业完成.

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

Jes*_*per 26

而不是遍历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
}
Run Code Online (Sandbox Code Playgroud)

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

另外,声明你Map的类型参数:

public void myMethod (final Map<String, List<FeatureKey>> pFeatureGroupsFromPackage) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)


sha*_*ner 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 + ")" );
      }
Run Code Online (Sandbox Code Playgroud)