Там есть только один тип выражения "если". Другое является условным выражением. Что касается того, что будет работать лучше: они могут компилироваться в один и тот же байт-код, и я ожидаю, что они будут вести себя одинаково - или настолько близко, что вы определенно не захотите выбирать один из них с точки зрения производительности.
Иногда оператор 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
в пределах brance или нет (в отличие от моей предыдущей чрезвычайно ошибочной попытки :), но я был бы очень удивлен если JITter оказался с другим собственным кодом.