[英]Does Java have mutable types for Integer, Float, Double, Long?
[英]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 < 20
的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的粗體操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.