3

我正在使用Code Pro查看我的应用程序代码,并且该工具报告了以下消息:

警告:使用布尔文字进行相等性测试

对于此代码:

boolean valid;
if(valid == true)

可以使用以下方法修复:

if(valid) 

我有两个问题:

  1. 这只是一个好的编码习惯吗?
  2. 在内存优化或性能优化方面还有其他好处吗?
4

4 回答 4

5

对于更直接的布尔表达式:

boolean valid = true;

if(valid) {
}

生成以下字节码:

0: iconst_1      
1: istore_1      
2: iload_1       
3: ifeq          6
6: return     

而通过扩展比较:

boolean valid = true;

if(valid == true) {
}

生成以下字节码:

0: iconst_1      
1: istore_1      
2: iload_1       
3: iconst_1      
4: if_icmpne     7
7: return

我怀疑ifeqif_icmpne不同的执行速度,所以额外的成本if(valid == true)实际上只是额外的常数值,可以忽略不计。

总而言之,实际上没有性能差异,并且 CodePro 仅将您的代码标记为最佳实践。

于 2013-03-23T04:49:16.613 回答
1

我会说这更像是一种很好的做法。一、代码更紧凑。第二,代码读起来更像自然语言。

我不知道一种或另一种方式是否有任何好处。我的猜测是 Java 编译器非常成熟,两个选项的性能大致相同。

于 2013-03-23T04:43:24.597 回答
1

这只是一个好的编码习惯吗?

是的。两个原因:

  • 这个b == true成语冗长且语言丑陋。(你会问,“教皇是天主教徒是真的吗?”或“教皇是天主教徒吗?”......?)

  • b == true成语是 Java 中唯一一种可能被误写为b = true.

在内存优化或性能优化方面还有其他好处吗?

几乎可以肯定不是。

当这两位代码产生不同的字节码时,JIT 编译器很可能会将它们转换为相同的本机指令序列,或者具有相同性能的序列。(如果不是,那么优化器“错过了一个技巧”)。

无论哪种方式,差异都可能太小而不能太小而不能显着。

于 2013-03-23T06:05:20.217 回答
0

行为没有区别,虽然我不能对每个 JVM 发表权威的看法,但很难想象会有任何性能差异可言。

于 2013-03-23T04:41:02.200 回答