tl; dr私の意見では+
、値の等価性をチェックするときに、単項を使用してオペランドの1つでボックス化解除をトリガーし、それ以外の場合は単に数学演算子を使用します。理論的根拠は次のとおりです。
==
比較Integer
は同一性比較であり、これは通常プログラマーが望んでいることではなく、その目的は値の比較を行うことであることはすでに述べました。それでも、コードのコンパクトさ、正確さ、速度の両方の点で、比較を最も効率的に行う方法について少し科学を行いました。
私は通常の方法を使用しました:
public boolean method1() {
Integer i1 = 7, i2 = 5;
return i1.equals( i2 );
}
public boolean method2() {
Integer i1 = 7, i2 = 5;
return i1.intValue() == i2.intValue();
}
public boolean method3() {
Integer i1 = 7, i2 = 5;
return i1.intValue() == i2;
}
public boolean method4() {
Integer i1 = 7, i2 = 5;
return i1 == +i2;
}
public boolean method5() { // obviously not what we want..
Integer i1 = 7, i2 = 5;
return i1 == i2;
}
コンパイルと逆コンパイル後にこのコードを取得しました:
public boolean method1() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
return var1.equals( var2 );
}
public boolean method2() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method3() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method4() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2.intValue() == var1.intValue() ) {
return true;
} else {
return false;
}
}
public boolean method5() {
Integer var1 = Integer.valueOf( 7 );
Integer var2 = Integer.valueOf( 5 );
if ( var2 == var1 ) {
return true;
} else {
return false;
}
}
簡単にわかるように、メソッド1はInteger.equals()
(明らかに)呼び出し、メソッド2〜4はまったく同じコードになり、値を使用して値をアンラップ.intValue()
してから直接比較し、メソッド5はID比較をトリガーするだけなので、値を比較します。
(例えばJSによってすでに言及されているように)equals()
オーバーヘッドが発生するため(instanceof
キャストを実行する必要があり、キャストがチェックされていない)、メソッド2〜4はまったく同じ速度で動作します。キャスト&を最適化する可能性がありinstanceof
ます。
それは他の比較演算子と非常によく似ています(例:<
/ >
)-それらはアンボクシングをトリガーしcompareTo()
ますが、使用しません-しかし、今回intValue()
はただのゲッターメソッド(最適化される最有力候補)であるため、操作はHSによって高度に最適化されます。
私の意見では、めったに使われないバージョン4が最も簡潔な方法がある-すべての味付けC / Java開発者は、その単項を知っているプラス、ほとんどのケースであるにキャストに等しいint
/ .intValue()
-それは少しかもしれないがWTFのいくつかのためのモーメント(主にこれらのdidn有効期間中に単項プラスを使用しないでください)、それは間違いなく意図を最も明確かつ最も簡潔に示します- int
オペランドの1つの値が必要であることを示し、他の値も強制的にボックス化解除します。またi1 == i2
、プリミティブint
値に使用される通常の比較と間違いなく最も類似しています。
私の投票はのために行くi1 == +i2
とi1 > i2
のスタイルInteger
のオブジェクト、両方のパフォーマンス&一貫性の理由から。また、型宣言以外を変更することなく、コードをプリミティブに移植できます。名前付きメソッドを使用することは、私にセマンティックノイズを導入するようなものであり、非常に批判bigInt.add(10).multiply(-3)
的なスタイルに似ています。