Java foreach efficiency

我有这样的东西:

Map<String, String> myMap = ...;

for(String key : myMap.keySet()) {
   System.out.println(key);
   System.out.println(myMap.get(key)); 
}

那么在前循环中叫一次?我认为是的,但想要你的意见。myMap.keySet()

我想知道以这种方式使用foreach是否会对性能产生影响,或者它等效于此:myMap.keySet()

Set<String> keySet = myMap.keySet();
for (String key : keySet) {
   ...
}

答案 1

如果你想绝对确定,那么两种方式编译它,反编译它并进行比较。我使用以下来源执行此操作:

public void test() {
  Map<String, String> myMap = new HashMap<String, String>();

  for (String key : myMap.keySet()) {
    System.out.println(key);
    System.out.println(myMap.get(key));
  }

  Set<String> keySet = myMap.keySet();
  for (String key : keySet) {
    System.out.println(key);
    System.out.println(myMap.get(key));
  }
}

当我用Jad反编译类文件时,我得到:

public void test()
{
    Map myMap = new HashMap();
    String key;
    for(Iterator iterator = myMap.keySet().iterator(); iterator.hasNext(); System.out.println((String)myMap.get(key)))
    {
        key = (String)iterator.next();
        System.out.println(key);
    }

    Set keySet = myMap.keySet();
    String key;
    for(Iterator iterator1 = keySet.iterator(); iterator1.hasNext(); System.out.println((String)myMap.get(key)))
    {
        key = (String)iterator1.next();
        System.out.println(key);
    }
}

所以这就是你的答案。它以任一 for 循环形式调用一次。


答案 2

它只被调用一次。实际上,它使用迭代器来执行该操作。

此外,就您而言,我认为您应该使用

for (Map.Entry<String, String> entry : myMap.entrySet())
{
    System.out.println(entry.getKey());
    System.out.println(entry.getValue());
}

以避免每次都在地图上进行搜索。


推荐