迄今为止在
之间发布的任何Java版本中是否存在性能差异 foo != null
和
null != foo
?
我个人认为对象的上述两种形式的空检查的行为没有任何变化,但不确定哪一种表现更好。我知道差异会很小,如果有的话,但是想知道为什么有人以这种方式编写了所有代码。
答案 0 :(得分:6)
应该没有性能差异,但形式可读性透视foo!= null更好。因为通常在左侧我们将想要比较的内容与右侧的值进行比较。通常我们会将我们的对象比如foo与null进行比较。
答案 1 :(得分:5)
这来自旧C时代。它以foo == null(null == foo)开始。
在c语法中有效(编译器没有抱怨):
if (foo = null) {
}
为了防止这种微妙的错误语法开始使用:
if (null == foo) {
}
因为null是常量 if(null = foo){ }
变成语法错误。
在java中,只有一个案例重要:
boolean someBoolean;
if (someBoolean = true) {
}
是运行时错误,但编译
这个
boolean someBoolean;
if (true = someBoolean) {
}
是编译错误。
没有性能问题,在某些情况下只有错误预防。
答案 2 :(得分:4)
Equality is symmetric。所以顺序在语义上无关紧要。
传统风格说你先把你要检查的东西放在最后。这遵循(至少许多欧洲语言)语言形式,例如“是x null吗?”不是“是空x?”。
在历史的某个时刻,人们习惯在C中写if (NULL == x)
。这样编译器会通过说“你不能分配给常量”来捕获意外的语法错误if (NULL = x)
。 。标准代码质量工具现在可以获取这些类型的错误,因此这种做法现在已经过时了。
答案 3 :(得分:3)
时尚是关于yoda风格。这只是个人喜好的问题。
“Yoda Conditions” - 使用if(constant == variable)而不是if (变量==常量),如if(4 == foo)。因为它就像说 “如果蓝色是天空”或“如果高大就是男人”。
答案 4 :(得分:2)
这两种形式没有区别。
无论如何,都有以下指令 - 加载foo的值,与0(null)比较并读取比较结果。
现在,如果是equals()方法,则会有所不同:)
答案 5 :(得分:2)
public class Stack
{
public static void main(String[] args)
{
Object obj0 = null;
Object obj1 = new Object();
long start;
long end;
double difference;
double differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (obj0 == null);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (null == obj0);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (obj1 == null);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
differenceAvg = 0;
for (int j = 0; j < 100; j++)
{
start = System.nanoTime();
for (int i = 0; i < 1000000000; i++)
if (null == obj1);
end = System.nanoTime();
difference = end - start;
differenceAvg +=difference;
}
System.out.println(differenceAvg/100);
}
}
在Object
被初始化的情况下,没有收集任何内容;但是,当Object
为null
时,几乎在每个平均案例中,obj0 == null
都比null == obj0
快。我又跑了21次,其中20次就是这样。