Java 哪个更有效:if(null==variable)还是if(variable==null)?

Java 哪个更有效:if(null==variable)还是if(variable==null)?,java,null,if-statement,Java,Null,If Statement,在Java中,哪个更有效,有什么区别 if (null == variable) 或 (与此问题类似:) 我要说的是,这两种表达方式在表现上完全没有区别 然而,有趣的是,对于这两种情况,编译后的字节码(由OpenJDKsJavaC发出)看起来有点不同 对于布尔b=变量==null: 3: aload_1 // load variable 4: ifnonnull 11 // check if it's null 7: iconst_1

在Java中,哪个更有效,有什么区别

if (null == variable)

(与此问题类似:)

我要说的是,这两种表达方式在表现上完全没有区别

然而,有趣的是,对于这两种情况,编译后的字节码(由OpenJDKsJavaC发出)看起来有点不同

对于
布尔b=变量==null

 3: aload_1               // load variable
 4: ifnonnull 11          // check if it's null
 7: iconst_1              // push 1
 8: goto 12           
11: iconst_0              // push 0
12: istore_2              // store
对于
布尔b=null==变量

 3: aconst_null           // push null
 4: aload_1               // load variable
 5: if_acmpne 12          // check if equal
 8: iconst_1              // push 1
 9: goto 13
12: iconst_0              // push 0
13: istore_2              // store
正如@Bozho所说,
variable==null
是最常见、默认和首选的样式

但是,在某些情况下,我倾向于将
null
放在前面。例如,在以下情况下:

String line;
while (null != (line = reader.readLine()))
    process(line);
没有区别

if(variable==null)
是(imo)一种更好的编程风格

请注意,
null
在Java中是小写的。

没有区别

(null==变量)
在过去的好时光中有时会用到(C语言) 避免书写:
(variable=NULL)
错误地

第一个是C语言的一个遗留问题,如果(variable=NULL)被调用,编写
是完全合法的,目的是防止您意外地使用赋值(
=
)而不是等式检查(
=
)。

简短回答:没有区别

更详细的回答:风格上的差异是相当主观的。有些人认为常量应该放在左边作为一种防御性样式,以防您在
==
中输入错误。有些人认为常量应该是正确的,因为它更自然、更可读

一种设计良好的语言,结合良好的编译器和静态分析工具,偏执狂可以最小化,因此您应该编写可读性最好、最自然的代码,这将是右边的常量

相关问题 请下次使用搜索功能


没有任何区别。

我的意见是:不要在意这些微不足道的性能优化。如果您的性能不好,请找出代码中真正的问题/瓶颈,并将其作为目标。

从性能角度看,没有实质性差异

但是。。。如果您输入了一个拼写错误,漏掉了一个equals字符怎么办?

foo = null; // assigns foo to null at runtime... BAD!

null = foo; // compile time error, typo immediately caught in editor,
developer gets 8 hours of sleep
这是一个支持在左侧使用null开始if测试的参数

支持使用null开始if测试的第二个参数是,代码读者非常清楚,他们正在查看null测试,即使等号右侧的表达式冗长

@aiooba还指出了第二个论点:

但是,在某些情况下,我倾向于将null放在前面。对于 在以下情况下的实例:

String line;
while (null != (line = reader.readLine()))
    process(line);

是的,我同意
if(null==variable)
将是Yoda风格:)此处解释:@b.roth//未找到页面。不幸的是,+1好发现。。。但就性能而言,还是一样的?:)我不知道。检查JIT编译器的输出(比如Sun java的x86实现)并一劳永逸地解决它是很酷的:D你知道怎么做吗?不:)(我仍然想知道为什么这个答案没有更高的投票率…)如果有帮助的话,我可以投你的反对票,波佐;)我无法证明这一点,但我相信不同版本的JDK会产生不同的优化字节码。也就是说,我不明白为什么另一个编译器不应该为这两个编译器生成相同的字节码。@Stroboskop,好吧,java编译器从来没有在优化字节码上花那么多精力。基本上,大多数编译器只是简单地将java代码转换为字节码,原因很简单,优化应该推迟到已知硬件等的JIT编译。也就是说,我怀疑这两种情况下产生的机器代码会有所不同。我的意思是,它们在语义上是等价的,而且非常简单,可以编译成最有效的机器代码。顺便说一句,它在Java中是
null
,而不是
null
@ryanprayogo-可能是一个常量…检查这个链接()它不是真的:null不是boolean类型,事实并非如此legal@assylias除了变量是booleanxD@assylias这是真的,但是布尔x=真;如果(x=null),则为valid@nachokk我明白了-在这种情况下,它会抛出NPE。很公平。SO链接返回“未找到页面”
String line;
while (null != (line = reader.readLine()))
    process(line);