条件变量如何工作并在Java中存储在内存中?

时间:2015-04-16 00:27:13

标签: java performance variables conditional-statements final

//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){}
}
  1. 如果我进入循环,结果会改变吗?

1 个答案:

答案 0 :(得分:3)

我使用这些语句编译代码并进行反汇编。

如您所见,整数文字与public static final基元的比较之间的比较没有区别。

奇怪的是,在某些JVM上,如果bipushiaddiconst更有效,则比较(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