Здесь есть только один тип оператора «если». Другой - условное выражение. Что касается того, что будет работать лучше: они могут компилироваться в один и тот же байт-код, и я ожидал, что они будут вести себя идентично - или настолько близко, что вы определенно не захотите выбирать один из них с точки зрения производительности.
Иногда if
оператор будет более читабельным, иногда условный оператор - более читабельным. В частности, я бы рекомендовал использовать условный оператор, когда два операнда просты и не имеют побочных эффектов, тогда как если основная цель двух ветвей - их побочные эффекты, я бы, вероятно, использовал if
оператор.
Вот пример программы и байт-кода:
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;
}
}
Байт-код декомпилирован с помощью 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
}
Как видите, есть небольшая разница в байт-коде - независимо от того, istore_1
происходит ли это внутри марки или нет (в отличие от моей предыдущей очень ошибочной попытки :), но я был бы очень удивлен, если бы JITter закончился с другим собственным кодом.