if
Javaには、classic:if {} else {}
とshorthand:の2種類のステートメントがありますexp ? value1 : value2
。一方が他方より速いですか、それとも同じですか?
ステートメント:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
三項演算子:
int x = (expression) ? 1 : 2;
if
Javaには、classic:if {} else {}
とshorthand:の2種類のステートメントがありますexp ? value1 : value2
。一方が他方より速いですか、それとも同じですか?
ステートメント:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
三項演算子:
int x = (expression) ? 1 : 2;
if
ステートメントで使用するためのものです。?
式で使用するためのものです。
回答:
そこには「if」ステートメントのタイプが1つだけあります。もう1つは条件式です。どちらのパフォーマンスが向上するかについては、同じバイトコードにコンパイルでき、同じように動作することが期待されます。または、パフォーマンスの観点からどちらかを選択したくないほど近いものになると思います。
時にはif
文は、時には条件演算子が読みやすくなり、読みやすくなります。特に、2つのオペランドが単純で副作用がない場合は条件演算子を使用することをお勧めしますが、2つの分岐の主な目的がそれらの副作用である場合は、おそらく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が異なるネイティブコードで終わった場合は非常に驚きます。
main
を意味するのではなくmain2
、まったく同じであるとは思いませんか?
他のすべての答えに追加するだけです:
2番目の式は、多くの場合、三項/三項演算子/ステートメントと呼ばれます。式を返すので非常に便利です。通常の短いステートメントのコードがより明確になる場合があります。
final
フィールドの場合、コンストラクターブロックを使用して値を設定でき(条件演算子は10億倍優れたIMOに見えますが)、ローカル変数を使用すると、後でコードブロックで最初に使用する前に値を割り当てることができます。三元が有利になる唯一のケースは、コンストラクターをif-else
呼び出すとき、super(...)
またはthis(...)
コンストラクター内にあるときだと思います。
三項演算子は、if-else条件よりも高速です。
public class TerinaryTest {
public static void main(String[] args)
{
int j = 2,i = 0;
Date d1 = new Date();
for(long l=1;l<100000000;l++)
if(i==1) j=1;
else j=0;
Date d2 = new Date();
for(long l=1;l<100000000;l++)
j=i==1?1:0;
Date d3 = new Date();
System.out.println("Time for if-else: " + (d2.getTime()-d1.getTime()));
System.out.println("Time for ternary: " + (d3.getTime()-d2.getTime()));
}
}
試験結果:
トレイル-1:
if-elseの時間:63
三項の時間:31
トレイル-2:
if-elseの時間:78
三項の時間:47
トレイル3:
if-elseの時間:94
三項の時間:31
トレイル-4:
if-elseの時間:78
三項の時間:47