循环条件是否计算了Java中"for"句子的每个循环?

fly*_*pen 9 java optimization loops

这是我的Java代码:

List<Object> objects = new ArrayList();

// Assign values to objects
...

for (int i = 0; i < objects.size(); i++) {
    Object object = objects.get(i);
    ...
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. objects.size()说明循环之前只计算一次,或者是计算每个循环?
  2. 如果objects.size()计算每个循环,那么如果其他线程在没有多线程保护的情况下同时更改它,则代码可能会崩溃.

我对么?

Boh*_*ian 12

回答:

  1. objects.size()称为每个循环(是否计算取决于ArrayList实现,你不应该关心)
  2. 是的,另一个线程可能会更改列表,这将影响您的循环

真实答案:

你不应该关心,这里你不必如何:

  1. 使用CopyOnWriteArrayList,它是线程安全的.如果使用迭代器迭代它(因为foreach语法在内部使用),您将迭代列表,就像迭代开始时一样
  2. 使用foreach语法,这意味着您不必使用索引等 - 它已为您完成:

for (Object object : objects) {
    // do something with each object 
}
Run Code Online (Sandbox Code Playgroud)


Tod*_*odd 7

是的,它每次计算.如果您有另一个线程改变对象列表的大小,循环条件将不断变化.