在整数/ Double/Float数字用法的情况下,java是否使用内存

Ana*_*666 1 java memory performance integer

我正面临一个混乱的希望,任何人都可以回答.请参阅下面的代码

for(int i = 0; i < 40; i++){
    if(i < 20){  //Does this 20 here is initialized again and again
       System.out.println("less than 20");
    }else{
       System.out.println("greater than 20");
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:i <20中的20是否会一次又一次地初始化为一个整数,导致一次又一次地分配内存,或者java是否使用类似于它用于字符串的STRING POOL这样的概念.

根据知识它需要记忆,但我仍然想确定.原因是:

我正在研究一个性能过于密集的代码,因此我无法在其中添加条件代码.像下面的东西

 for(int p = 0; p < 10; p++){
            if(p < 20){
                System.out.println("ABC");
            }
            if(p < 20 && "SomeValue".equals("SomeValue")){
                System.out.println("SomeValue");
            }
            if(p < 20 && "ABC".equals("ABC")){
                System.out.println("ABCDEF");
            }
        }
Run Code Online (Sandbox Code Playgroud)

所以,如果答案是肯定的,那20就占用了内存,那么我可以使代码如下所示

 int value = ("Coldrink".equals("coca cola"))?10:20;
        for(int p = 0; p < 10; p++){
            if(p < value){
                System.out.println("ABC");
            }
            if(p < value && "SomeValue".equals("SomeValue")){
                System.out.println("SomeValue");
            }
            if(p < value && "ABC".equals("ABC")){
                System.out.println("ABCDEF");
            }
        }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,变量值被初始化一次并且我已经放置了我自己的条件,这可能会有一些性能问题,但后来我减少了内存消耗,这可能会使事情变得平稳.

编辑:谢谢@TJ克劳德让我的困惑得到澄清.有相同问题的人请阅读已接受的答案以及点击此资源

T.J*_*der 8

是否20i < 20被初始化为整数一次又一次一次又一次引起的内存分配或不Java使用类似有点像它使用字符串一个字符串池的概念.

都不是.这20是一个原始int值 - 不是Integer实例 - 它在字节码中被硬编码并加载到用于比较操作的寄存器中.不需要像字符串实习池这样的东西,也不需要每次迭代都有新的分配.

我们可以通过将该循环放在一个main示例类中来看到这一点:

public class Example {
    public static void main(String[] args) {
        for(int i = 0; i < 40; i++){
            if(i < 20){  //Does this 20 here is initialized again and again
               System.out.println("less than 20");
            }else{
               System.out.println("greater than 20");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...然后编译它,并通过javap -c Example以下方式查看字节码:

Compiled from "Example.java"
public class Example {
  public Example();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_0
       1: istore_1
       2: iload_1
       3: bipush        40
       5: if_icmpge     39
       8: iload_1
       9: bipush        20
      11: if_icmpge     25
      14: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      17: ldc           #3                  // String less than 20
      19: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      22: goto          33
      25: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      28: ldc           #5                  // String greater than 20
      30: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      33: iinc          1, 1
      36: goto          2
      39: return
}

请注意偏移9和11处的粗体操作.