Is CONSTANT.equals(VARIABLE) faster than VARIABLE.equals(CONSTANT)?
Interesting question. Here is the test I wrote:
public class EqualsTest {
public static String CONST = "const";
public void constEqVar(String var) {
CONST.equals(var);
}
public void varEqConst(String var) {
var.equals(CONST);
}
}
Then I compiled it using javac: javac EqualsTest.java
and disassembled it using javap
: javap -c EqualsTest
.
Here is the relevant snippet of javap output:
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
As you can see the only difference between theses 2 methods is order of operations: getstatic and then aload_1 in first case and aload_1 + getstatic in second case.
Pretty obvious that the execution time should not depend on this order.
The only reason to prefer const.equals(var)
rather than var.equals(const)
is to avoid NullPointerException
.
For me its not a speed issue, its a relability issue.
e.g.
"Hello".equals(a); // will never throw a NPE
a.equals("Hello"); // can throw an NPE.
You may prefer it to blow up when a is null
but usually I don't.
That depends only on the implementation of the equals method. It could be quicker, it could be the slower and it could be the same... Often it is the same. Also it does not depend on the fact that one is a variable and the other a constant but on the content both objects.
One advantage of Constant.equals(variable) is that you can't have a NullPointerException on the .equals