This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

I'm pleased you actually looked at the disassembly and hope it taught you something. I had hoped someone with actual Java experience would answer your final question about the optimized code, but perhaps you can post that specific part over on Stackoverflow - it seems to be a very concrete question.
–
Joris TimmermansOct 8 '12 at 15:41

Yes, I will try to get the optimized code. (The question changed a bit, I asked the thing with the optimized code in the edit)
–
PucklOct 8 '12 at 15:49

3 Answers
3

The common answer to most of these questions should be "why don't you try it and find out?". In Java you could probably take a look at the generated bytecode (I believe the tool is called javap), to see what the difference in byte code is between those two ways of declaring the variable.

Doing it like that is a better learning experience for you, because next time you're running into an optimization issue you can use the same tool to verify that the compiler is doing what you are expecting - it will help you avoid needlessly changing your coding style when the optimizer does fine on its own, or finding actual tweaks when you really need that last bit of performance.

At the level of the individual variable there is no significant difference in effeciency, but if you had a function with 1000 loops and 1000 variables (never mind the bad style implied) there could be systemic differences because all the lives of all the variables would be the same instead of overlapped. This could affect things like stack size and the garbage collector's ability to clean up the variables that were being kept alive longer than necessary.

This is not true - at the JVM level, there is no such thing as limited scope for local variables.
–
Michael BorgwardtOct 8 '12 at 9:46

do you mean that if I write for(int i= ..) 1000 times, there will be 1000 different variables on the stack when I exit the function?
–
ddyerOct 8 '12 at 9:55

according to artima.com/insidejvm/ed2/jvm8.html "For example, if two local variables have limited scopes that don't overlap, such as the i and j local variables in Example3b, compilers are free to use the same array entry for both variables. " And that only makes sense, compilers are free to optimize the size of the stack frame in this way.
–
ddyerOct 8 '12 at 10:09

1

Good point; but if we're talking about compiler optimizations, the compiler can almost as easily reuse local variable entries for variables that have overlapping lexical scope but are not used in an overlapping manner.
–
Michael BorgwardtOct 8 '12 at 10:43