Chỉ có một loại câu lệnh "nếu" ở đó. Còn lại là một biểu thức điều kiện. Đối với cái nào sẽ hoạt động tốt hơn: chúng có thể biên dịch sang cùng một mã bytecode và tôi hy vọng chúng sẽ hoạt động giống hệt nhau - hoặc gần đến mức bạn chắc chắn sẽ không muốn chọn cái này hơn cái kia về hiệu suất.
Đôi khi một if
câu lệnh sẽ dễ đọc hơn, đôi khi toán tử điều kiện sẽ dễ đọc hơn. Đặc biệt, tôi khuyên bạn nên sử dụng toán tử điều kiện khi hai toán hạng đơn giản và không có hiệu ứng phụ, trong khi nếu mục đích chính của hai nhánh là tác dụng phụ của chúng, tôi có thể sử dụng một if
câu lệnh.
Đây là một chương trình mẫu và mã bytecode:
public class Test {
public static void main(String[] args) {
int x;
if (args.length > 0) {
x = 1;
} else {
x = 2;
}
}
public static void main2(String[] args) {
int x = (args.length > 0) ? 1 : 2;
}
}
Bytecode được dịch ngược với javap -c Test
:
public class Test extends java.lang.Object {
public Test();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main(java.lang.String[]
Code:
0: aload_0
1: arraylength
2: ifle 10
5: iconst_1
6: istore_1
7: goto 12
10: iconst_2
11: istore_1
12: return
public static void main2(java.lang.String[
Code:
0: aload_0
1: arraylength
2: ifle 9
5: iconst_1
6: goto 10
9: iconst_2
10: istore_1
11: return
}
Như bạn có thể thấy, có một sự khác biệt nhỏ trong bytecode ở đây - cho dù điều này có istore_1
xảy ra trong phạm vi hay không (không giống như nỗ lực cực kỳ thiếu sót trước đây của tôi :) nhưng tôi sẽ rất ngạc nhiên nếu JITter kết thúc với mã gốc khác.