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

时间:2017-04-04 13:14:17

标签: java performance memory 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");
    }
}

所以我的问题是:中的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");
            }
        }

所以,如果答案是肯定的,那就是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");
            }
        }

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

编辑:谢谢@ T.J Crowder让我的困惑得到澄清。遇到相同问题的人请阅读已接受的答案以及Click on this resource too

1 个答案:

答案 0 :(得分:8)

  

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

都不是。 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");
            }
        }
    }
}

...然后编译它,并通过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处的粗体操作。