Es gibt dort nur eine Art von "if" -Anweisung. Der andere ist ein bedingter Ausdruck. Was die bessere Leistung betrifft: Sie könnten mit demselben Bytecode kompiliert werden, und ich würde erwarten, dass sie sich identisch verhalten - oder so nah, dass Sie in Bezug auf die Leistung definitiv nicht übereinander wählen möchten.
Manchmal ist eine if
Anweisung besser lesbar, manchmal ist der bedingte Operator besser lesbar. Insbesondere würde ich mit dem Bedingungsoperator empfehlen , wenn die beiden Operanden sind einfache und nebenwirkungsfrei, während , wenn der Hauptzweck der beiden Zweige sind ihre Nebenwirkungen, ich wahrscheinlich eine verwenden würde if
Aussage.
Hier ist ein Beispielprogramm und ein 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 dekompiliert mit 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
}
Wie Sie sehen können, gibt es hier einen kleinen Unterschied im Bytecode - ob der istore_1
innerhalb der Brance auftritt oder nicht (im Gegensatz zu meinem vorherigen äußerst fehlerhaften Versuch :), aber ich wäre sehr überrascht, wenn der JITter einen anderen nativen Code hätte.