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