Java foreach循环是否会在每次迭代时获得一个列表

时间:2014-07-18 07:58:56

标签: java collections foreach

假设我有dataObject,其getChildren()函数返回一个集合,但无论出于何种原因,我都希望避免这个过程缓慢。然后我想迭代所述集合。为此,getChildren()会在没有子项时返回空集合,而不是null

我可以逃脱:

for(dataObject child : parent.getChildren()){ ... }

或是每次循环调用getChildren(),这意味着为了避免每次都付出昂贵的电话,我需要改为:

Collection<dataObject> children = parent.getChildren();
for(dataObject child : children){ ... }

如果父母返回一个不同的集合,这也可能会导致问题,例如,如果添加/删除了一个孩子,我想要查看当时孩子们的快照(让我们的光泽度过高)其他问题)。

我怀疑第一个版本确实很好,因为for循环会在它启动时获得集合的迭代器并且只是引用迭代器,但它是我从未确认过的东西。

1 个答案:

答案 0 :(得分:3)

来自JLS

  

增强的for语句相当于一个基本的for语句   形式:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    {VariableModifier} TargetType Identifier =
        (TargetType) #i.next();
    Statement
}

所以它只评估Iterable一次。