While going through the collections code in JDK, wherever looping is used, it is done in reverse way like this:
for (int i = size-1; i >= 0; i--) {...}
Is there any performance related thing or just JDK has adopted it like this?
While going through the collections code in JDK, wherever looping is used, it is done in reverse way like this:
for (int i = size-1; i >= 0; i--) {...}
Is there any performance related thing or just JDK has adopted it like this?
There does not seem to be any performance benefit in Java, in general. (Also, the assertion that the JDK code does reverse looping a lot seems to be unfounded.)
See all the linked similar/duplicate questions, such as Why does decrement loop runs faster than increment loop?
There are also some articles online benchmarking the performance of different loop types, based on different collection types. Like https://www.trinea.cn/android/arraylist-linkedlist-loop-performance-en/
 
    
    As mentioned by @tkruse, calling collection.size (); means you do the following every iteration:
Whereas, if you initialize i = collection.size () - 1; it will only be done once.
I am not familiar with Java bytecode but bytecode is somewhat similar to assembly code such that it will be translated to machine code. As such, it is worth mentioning that memory access is slower than register access and, in some cases, comparing to any value other than 0 can have an additional instruction per iteration.
Here's an example using NASM:
i++ version
    xor eax, eax        ;i = 0
  label:
    mov ebx, [size]     ;temp = size
    sub ebx, eax        ;temp - i (Note: A >= B == 0 >= B - A)
    jle end             ;temp <= 0 goto end
    inc eax             ;i ++
    jmp label           ;temp > 0 goto label
  end:
i-- version
    mov eax, [size]     ;i = size
    dec eax             ;i = size - 1
  label:
    cmp eax, 0          ;i < 0?
    jl end              ;i < 0 goto end
    dec eax             ;i --
    jmp label           ;i >= 0 goto label
  end:
