键集上的Java迭代

键集上的Java迭代,java,optimization,iteration,keyset,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>) pFeatureGroupsFromPackag

我有以下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
   }
}
public void myMethod(包中的最终映射pfeaturegroups){
最终设置键=pFeatureGroupsFromPackage.keySet();
用于(最终字符串键:键){
tmpList=(列表)pFeatureGroupsFromPackage.get(键);
//做任何事
}
}
“findBugs”向我发出警告,告诉我:

方法
myMethod
使用键集迭代器代替entrySet迭代器效率低下。 警告在
tmpList
分配中完成

我不明白为什么这是低效的。实际上,
列表只计算一次。
有什么评论吗?谢谢。

您将获得所有钥匙,然后搜索收藏中的每一把钥匙

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

不要迭代
键集
并调用
get
来获取每个键的对应值,而是迭代
入口集

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
}

可能是您正在查询地图两次:

  • 首先是钥匙
  • 其次是价值观

使用entryset迭代器将在映射上迭代一次。

通过键集迭代器访问HashMap甚至比在树映射上使用键集迭代器更快。

, 使用keysey迭代器不如entryset迭代器有效的原因是,在第一个选项中,您仍然必须使用Map.get(key)lookeup,而在第二个选项中,这是可以避免的。

这可以帮助您:

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);
}
示例代码:

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

Hi Jesper。谢谢你的回答。顺便说一句,有两个语法错误(一个缺少'>',应该是entry而不是enty):-)+1,您可以接受
for (Map.Entry < Integer, List < FeatureKey >>> i: map.entrySet()) {
    System.out.println(i.getValue() + " " + i.getKey()));
}