keySet 上的 Java 迭代

标签 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 列表只计算一次。 任何意见?谢谢。

最佳答案

不是遍历 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 中查找每个键;直接一次性获取key和value。

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

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

关于keySet 上的 Java 迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5430883/

相关文章:

java - 如何在java中的char上使用.set()或.setvalue()

c++ - 在数组中找到两个最小 int64 元素的最快方法

Kotlin:自定义顺序的迭代器

arrays - 从 Swift 3 中的字符串数组中读取随机项

Java RMI 实现其他项目的接口(interface)

java - 当包含属性时 Jackson 反序列化失败

algorithm - 动态规划 : Maximizing

python - 遍历给定起点的列表

java - 如何迭代比java中列表指定的大小更多的次数

generics - 我们可以在黑莓应用程序开发中使用通用类或集合类吗