I want to ask which piece of code is more efficient in Java? Code 1:
void f()
{
for(int i = 0 ; i < 99999;i++)
{
for(int j = 0 ; j < 99999;j++)
{
I would prefer the first over the second because it keeps the loop variables out of the way of the rest of the code in the method. Since they're not visible outside of the loop, you can't accidentally refer to them later on.
The other answers are right, too: don't worry about this sort of thing for performance. But do think about it for code readability reasons, and for communicating programmer intent to the next person who comes along. This is much more important than micro-optimization concerns.
Now, that's at the Java language (as in Java Language Specification) level. At the Java Virtual Machine level, it makes absolutely no difference which of those two you use. The locals are allocated in exactly the same way.
If you're not sure, you can always compile it and see what happens. Let's make two classes, f1 and f2, for the two versions:
$ cat f1.java
public class f1 {
void f() {
for(int i = 0 ; i < 99999;i++) {
for(int j = 0 ; j < 99999;j++) {
}
}
}
}
$ cat f2.java
public class f2 {
void f() {
int i, j;
for(i = 0 ; i < 99999;i++) {
for(j = 0 ; j < 99999;j++) {
}
}
}
}
Compile them:
$ javac f1.java
$ javac f2.java
And decompile them:
$ javap -c f1 > f1decomp
$ javap -c f2 > f2decomp
And compare them:
$ diff f1decomp f2decomp
1,3c1,3
< Compiled from "f1.java"
< public class f1 extends java.lang.Object{
< public f1();
---
> Compiled from "f2.java"
> public class f2 extends java.lang.Object{
> public f2();
There's absolutely no difference in the bytecode.