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 はまったく同じ速度で動作し、HotSpot ではないため、タイトなループで使用する場合は方法 1 よりも明らかに優れています。キャスト & を最適化する可能性がありinstanceof
ます。
他の比較演算子 (例: <
/ >
) と非常によく似ています - それらはボックス化解除をトリガーしますが、使用はしcompareTo()
ません - しかし今回は、操作は HS によって高度に最適化さintValue()
れます。
私の意見では、めったに使用されないバージョン 4 が最も簡潔な方法です。ベテランの C/Java 開発者なら誰int
でも、ほとんどの場合、単項プラスは/へのキャストに等しいことを知ってい.intValue()
ます。単項プラスを使用しないでください)、おそらく最も明確かつ最も簡潔に意図を示しています。これは、オペランドの 1 つの値が必要であり、他の値もボックス化解除することを強制することを示しています。また、プリミティブ値に使用される通常の比較に間違いなく最も似ています。int
i1 == i2
int
私の投票は、パフォーマンスi1 == +i2
と一貫性の両方の理由から、オブジェクトのi1 > i2
スタイルに賛成です。Integer
また、型宣言以外は何も変更せずに、コードをプリミティブに移植できるようにします。bigInt.add(10).multiply(-3)
名前付きメソッドを使用することは、非常に批判されているスタイルと同様に、セマンティック ノイズを導入するように思えます。