Java for each on the receiver

If javac does what I think, the following lines will have the same performance:

for (Object o: getObjects()) {}
List<Object> os = getObjects(); for (Object o: os) {}

Is this true or not? Or is it perhaps implementation specific? If yes: does anyone know about GWT?

+5
source share
5 answers

These answers seem correct in terms of pure Java. Moreover, if possible, the GWT compiler will actually rewrite the extended for loop further into a regular loop loop before it generates JavaScript. So actually it looks something like this:

for (int i = 0; i < getObjects().size(); i++) {
  Object o = getObjects().get(i);
  // ...
}

? - List , JavaScript, . .

. GWT, Google I/O, , GWT JS.

+5

.

Java Iterator, iterator() , .
. ( iterator())

+7

Java:

14.14.2

for :

EnhancedForStatement:
        for ( VariableModifiersopt Type Identifier: Expression) Statement

Iterable, (§10.1) .

FormalParameter for (§14.14)

for for.

Expression Iterable, I be Expression. iterator(). for for:

for (I #i = Expression.iterator(); #i.hasNext(); ) {

        VariableModifiersopt Type Identifier = #i.next();
   Statement
}

#i , ( ), (. 6.3) , .

, Expression . , .

+7

- :

 m1()V
   L0
    ALOAD 0
    INVOKEVIRTUAL it/funge/Console.getObjects()Ljava/util/List;
    INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
    ASTORE 2
    GOTO L1
   L2
   FRAME FULL [it/funge/Console T java/util/Iterator] []
    ALOAD 2
    INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
    ASTORE 1
   L1
   FRAME SAME
    ALOAD 2
    INVOKEINTERFACE java/util/Iterator.hasNext()Z
    IFNE L2
   L3
    RETURN

m2()V
   L0
    ALOAD 0
    INVOKEVIRTUAL it/funge/Console.getObjects()Ljava/util/List;
    ASTORE 1
   L1
    ALOAD 1
    INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
    ASTORE 3
    GOTO L2
   L3
   FRAME FULL [it/funge/Console java/util/List T java/util/Iterator] []
    ALOAD 3
    INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
    ASTORE 2
   L2
   FRAME SAME
    ALOAD 3
    INVOKEINTERFACE java/util/Iterator.hasNext()Z
    IFNE L3
   L4
    RETURN

, , List, . , ALOAD ASTORE , getObjects , , ..

+3

There is no difference. The foreach construct simply extracts Iteratorfrom the object. That is why he must implement the interface Iterable.

+2
source

All Articles