簡體   English   中英

如果使用整數/雙精度/浮點數,java是否使用內存

[英]Does java uses memory in case of integer/Double/Float number usage

我面臨混亂,希望任何人都能回答。 請看下面的代碼

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");
    }
}

所以我的問題是: 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");
            }
        }

因此,如果答案是肯定的,那么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");
            }
        }

如您所見,變量值被初始化一次,並且我將自己的條件設置為可能存在一些性能問題,但是后來我減少了內存消耗,這可以使事情變得均勻。

編輯:謝謝@ TJ Crowder消除了我的困惑。 有相同問題的人,請閱讀接受的答案以及也單擊此資源

i < 2020是否一次又一次初始化為整數,一次又一次地導致內存分配,還是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的粗體操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM