增强了循环

LyK*_*LyK 7 java performance for-loop

我经常遇到一些情况,我想使用一个强大的for循环来获取一些从某个对象获得的Collection或数组.

例如

items = basket.getItems();
for (int item : items) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是:

for (int item : basket.getItems()) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

第二个更紧凑,在我看来提高了可读性,特别是当item变量不会在其他任何地方使用时.

我想知道for语句中的getter是否对性能有任何影响.它会被优化到类似于第一个的东西吗?或者它每次都会访问吸气剂?当然getItems()可能做的事情很慢(例如网络访问等)

问题类似于其他问题,但是指的是集合/数组本身的getter而不是它的大小.但是,最终可能是相同的情况.

Jon*_*oni 9

getItems()在两种情况下,该方法仅被调用一次.两者之间没有区别,除了一个使用额外的局部变量,你可以在其他地方使用.

正如您在JLS 14.14.2中所读到的,增强的for循环大致转换为这个传统的for循环:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    TargetType Identifier = (TargetType) #i.next();
    Statement
}
Run Code Online (Sandbox Code Playgroud)

#i是一个自动生成的标识符,它与发生增强for语句时的范围(第6.3节)中的任何其他标识符(自动生成的或其他标识符)不同.

从这里可以清楚地看出,Expression只评估了一次.