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

How condition variables work and store in memory in Java?

//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. if 条件变量如何在 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. 如果我进入循环,结果会改变吗?

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

如您所见,整数文字之间的比较与 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