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 -c
tô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)