//Case1
if(a > 5){
//..
}
//Case2
private static final int NUM1 = 5;
if(a > NUM1){
//..
}
/////////////////////////////////////////////
//Case3
if(a > 6 + b){
//..
}
//Case4
private static final int NUM2 = 6;
if(a > NUM2 + b){
//..
}
在Java中
1. 如果条件的变量如何在java中工作? (例如: if(a> 5) 5如何存储在内存中?比如 final 或者?)
2.我应该使用case2而不是case1来获得更高的性能吗?
3.我应该使用case4而不是case3来获得更高的性能吗?
for(int i = 0; i < 1000000000; i++){
if(a > 5){}
if(a > NUM){}
if(a > 6 + b){}
if(a > NUM + b){}
}
答案 0 :(得分:3)
我使用这些语句编译代码并进行反汇编。
如您所见,整数文字与public static final
基元的比较之间的比较没有区别。
奇怪的是,在某些JVM上,如果bipush
和iadd
比iconst
更有效,则比较(a> 6 + b)可能比(a> 5)更快。我个人不确定为什么bipush
仅用于案例3和4。如果有人可以对此有所了解,我会感兴趣。
// method 1; if(a>5)
13: iload_1
14: iconst_5
15: if_icmple 25
18: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
21: iconst_1
22: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
// method 2; if(a>NUM1)
25: iload_1
26: iconst_5
27: if_icmple 37
30: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
33: iconst_2
34: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
// method 3; if(a > 6+b)
37: iload_1
38: bipush 6
40: iload_2
41: iadd
42: if_icmple 52
45: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
48: iconst_1
49: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
// method 4; if(a > 6+b)
52: iload_1
53: bipush 6
55: iload_2
56: iadd
57: if_icmple 67
60: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
63: iconst_1
64: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
67: return