Existe apenas um tipo de declaração "if" ali. A outra é uma expressão condicional. Quanto a qual terá melhor desempenho: eles podem compilar para o mesmo bytecode, e eu esperaria que eles se comportassem de forma idêntica - ou tão perto que você definitivamente não gostaria de escolher um em relação ao outro em termos de desempenho.
Às vezes, uma if
instrução será mais legível, às vezes o operador condicional será mais legível. Em particular, eu recomendaria usar o operador condicional quando os dois operandos são simples e livres de efeitos colaterais, ao passo que, se o objetivo principal dos dois ramos forem seus efeitos colaterais, provavelmente usaria uma if
instrução.
Aqui está um programa de amostra e 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 descompilado com 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 você pode ver, há uma ligeira diferença no bytecode aqui - se ele istore_1
ocorre dentro do brance ou não (ao contrário da minha tentativa anterior extremamente falha :) mas eu ficaria muito surpreso se o JITter acabasse com um código nativo diferente.