興味深い質問です。これが私が書いたテストです:
public class EqualsTest {
public static String CONST = "const";
public void constEqVar(String var) {
CONST.equals(var);
}
public void varEqConst(String var) {
var.equals(CONST);
}
}
次に、javac:を使用してコンパイルし、:をjavac EqualsTest.java
使用して逆アセンブルしました。javap
javap -c EqualsTest
javap出力の関連するスニペットは次のとおりです。
public void constEqVar(java.lang.String);
Code:
0: getstatic #2; //Field CONST:Ljava/lang/String;
3: aload_1
4: invokevirtual #3; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
7: pop
8: return
public void varEqConst(java.lang.String);
Code:
0: aload_1
1: getstatic #2; //Field CONST:Ljava/lang/String;
4: invokevirtual #3; //Method java/lang/String.equals:(Ljava/lang/Object;)Z
7: pop
8: return
ご覧のとおり、これら2つの方法の唯一の違いは、操作の順序です。最初のケースではgetstatic、次にaload_1、2番目のケースではaload_1+getstaticです。
実行時間がこの順序に依存してはならないことは明らかです。
を避けるconst.equals(var)
よりも好む唯一の理由は。var.equals(const)
NullPointerException