28

我的问题是关于使用 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() 有什么作用吗?

4

1 回答 1

56

在第一个示例中,map.values()将被评估一次。根据Java Language Specification 的第 14.4.2 节,它相当于:

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
}

aList如果恰好是,这将大大加快(上面链接的 Android 文档说是 3 倍)ArrayList,但对于LinkedList. 这一切都取决于究竟是什么样的List实现类aList

于 2012-04-18T20:35:22.480 回答