方法在 foreach 和 for 循环在 java 中

2022-09-01 14:02:19

我的问题是关于使用Android编译器在Java中进行优化。下面的map.values()是每次迭代都会被调用,还是Android编译器会优化它。

LinkedHashMap<String, Object> map;

for (Object object : map.values())
{
   //do something with object
}

同样,这是另一个例子。aList.size() 会在每次迭代时调用吗?

List<Object> aList;

for (int i = 0; i < aList.size(); i++)
{
    object = aList.get(i);
    //do something with i
}

在所有这些之后,它是否每次迭代都调用这些方法真的重要吗?Map.values() 和 List.size() 是否做了很多事情?


答案 1

在第一个示例中,将评估一次。根据 Java 语言规范的第 14.4.2 节,它等效于:map.values()

for (Iterator<Object> i = map.values().iterator(); i.hasNext(); ) {
    Object object = i.next();
    // do something with object
}

在第二个中,每次评估测试时都会调用。为了便于阅读,最好将其编码为:aList.size()

for (Object object : aList) {
    // do something with object
}

但是,根据Android文档,这将变慢。假设您没有更改循环中的列表大小,则最快的另一种方法是在循环之前拉出列表大小:

final int size = aList.size();
for (int i = 0; i < size; i++)
{
    object = aList.get(i);
    //do something with i
}

如果碰巧是 一个 ,这将大大快(上面链接的Android文档说是3倍),但对于一个来说可能会更慢(可能很多)。这完全取决于实现类的确切类型。aListArrayListLinkedListListaList


答案 2

推荐