我有一个简单的java if条件,带有布尔比较和枚举比较。
if(testBoolean && testEnumObj != TestEnum.Test) {
//TO DO:
}
出于性能原因,我得到了我的主管的建议,将其分成两块。我想确认上面的表达式是否会对性能或内存占用产生影响,而不是像下面那样有两个if块。
if(testBoolean) {
if(testEnumObj != TestEnum.Test) {
// TO DO:
}
}
在将第一个表达式分成第二个表达式时,我没有看到任何性能提升。只是想确认支持我的评论员的论点。
答案 0 :(得分:3)
没有任何改进,因为&&
是一个短路算子,如果第一个是false
,则不会评估第二个条件。这在JLS §15.23. Conditional-And Operator &&:
在运行时,首先计算左侧操作数表达式;如果结果具有布尔类型,则进行拆箱转换(§5.1.8)。
如果结果值为false,则条件表达式和表达式的值为false,并且不评估右侧操作数表达式。
如果您使用&
,则会有所不同testBoolean & testEnumObj != TestEnum.Test
会评估这两个条件,但将其切换为&&
而不是使用嵌套的if
语句会更具可读性。
答案 1 :(得分:2)
我认为审稿人的关注点应该是可读性而不是性能。一般来说,出于性能原因而在此级别更改代码是一个坏主意;而符合适用的可读性标准是支持其中一种形式优于另一种形式的正当理由。
那就是说,我的钱似乎是
if(testBoolean && (testEnumObj != TestEnum.Test)) {
//TO DO:
}
比上述任何一种方式更接近正确,因为
(1)你的方式让某人停下来思考行动的顺序
(2)"纠正"方式浪费了一个缩进级别
答案 2 :(得分:1)
以下基本类与给定的ur代码具有相同的条件
class sovjava{
public static void main(String ...a){
boolean i=true;
boolean j=true;
if(i && j){
}
if(i){
if(j){
}
}
}
}
//这是javap -c sovjava
从5到17看到的字节代码,观察到两者都会转换成相同的
Compiled from "sovjava.java"
class sovjava {
sovjava();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String...);
Code:
0: iconst_1
1: istore_1
2: iconst_1
3: istore_2
4: iload_1
5: ifeq 12
8: iload_2
9: ifeq 12
12: iload_1
13: ifeq 20
16: iload_2
17: ifeq 20
20: return
}
在比较条件
方面两者相同