Solo hay un tipo de instrucción "if" allí. La otra es una expresión condicional. En cuanto a cuál funcionará mejor: podrían compilar al mismo código de bytes, y esperaría que se comporten de manera idéntica, o tan cerca que definitivamente no querría elegir uno sobre el otro en términos de rendimiento.
A veces una declaración if
será más legible, a veces el operador condicional será más legible. En particular, recomendaría usar el operador condicional cuando los dos operandos son simples y libres de efectos secundarios, mientras que si el propósito principal de las dos ramas es sus efectos secundarios, probablemente usaría una declaración if
.
Aquí hay un ejemplo de programa y el código de bytes:
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 descompilada con 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
}
Como se puede ver, hay una ligero diferencia en el código de bytes de aquí - si se produce la istore_1
dentro de la brance o no (a diferencia de mi intento anterior muy defectuoso :) pero estaría muy sorprendido si el JITter terminara con un código nativo diferente.
Supongo que no hay absolutamente ninguna diferencia. Es solo sintaxis. A menos que los compiladores sean algo malvados (o algo más) y estoy equivocado – sinelaw
¿Lo (micro) comparaste? Comparte los resultados. – BalusC
Ambos recibirán jit'ed. No habrá ninguna diferencia en absoluto. Y no te molestes en descompilar las cosas.Lo primero que hace HotSpot es eliminar ** todas ** las optimizaciones que javac aplicó. –