Có thể trùng lặp:
Bạn khai báo biến ở đâu? Đầu của một phương pháp hoặc khi bạn cần chúng?
Liệu nó có tạo ra sự khác biệt nếu tôi khai báo các biến bên trong hoặc bên ngoài một vòng lặp trong Java không?
Có phải đây là
for(int i = 0; i < 1000; i++) {
   int temp = doSomething();
   someMethod(temp);
}
bằng cái này (đối với việc sử dụng bộ nhớ)?
int temp = 0;
for(int i = 0; i < 1000; i++) {
   temp = doSomething();
   someMethod(temp);
}
Và nếu biến tạm thời là ví dụ về ArrayList thì sao?
for(int i = 0; i < 1000; i++) {
   ArrayList<Integer> array = new ArrayList<Integer>();
   fillArray(array);
   // do something with the array
}
EDIT: với javap -ctôi đã nhận được đầu ra sau đây
Biến ngoài vòng lặp:
  public static void main(java.lang.String[]);
    Code:
       0: iconst_0      
       1: istore_1      
       2: iconst_0      
       3: istore_2      
       4: iload_2       
       5: sipush        1000
       8: if_icmpge     25
      11: invokestatic  #2                  // Method doSomething:()I
      14: istore_1      
      15: iload_1       
      16: invokestatic  #3                  // Method someMethod:(I)V
      19: iinc          2, 1
      22: goto          4
      25: return  
Biến trong vòng lặp:
  public static void main(java.lang.String[]);
    Code:
       0: iconst_0      
       1: istore_1      
       2: iload_1       
       3: sipush        1000
       6: if_icmpge     23
       9: invokestatic  #2                  // Method doSomething:()I
      12: istore_2      
      13: iload_2       
      14: invokestatic  #3                  // Method someMethod:(I)V
      17: iinc          1, 1
      20: goto          2
      23: return        
Và cho những người quan tâm, mã này:
public class Test3 {
    public static void main(String[] args) {
        for(int i = 0; i< 1000; i++) {
            someMethod(doSomething());
        }   
    }
    private static int doSomething() {
        return 1;
    }
    private static void someMethod(int temp) {
        temp++;
    }
}
sản xuất này:
  public static void main(java.lang.String[]);
    Code:
       0: iconst_0      
       1: istore_1      
       2: iload_1       
       3: sipush        1000
       6: if_icmpge     21
       9: invokestatic  #2                  // Method doSomething:()I
      12: invokestatic  #3                  // Method someMethod:(I)V
      15: iinc          1, 1
      18: goto          2
      21: return   
Nhưng tối ưu hóa xảy ra trong thời gian chạy sau đó. Có cách nào để xem mã được tối ưu hóa không? (Xin lỗi vì EDIT dài)