作者:胖蚂蚁 | 来源:互联网 | 2023-02-07 16:26
我正面临一个混乱的希望,任何人都可以回答.请参阅下面的代码
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
正如你所看到的那样,变量值被初始化一次并且我已经放置了我自己的条件,这可能会有一些性能问题,但后来我减少了内存消耗,这可能会使事情变得平稳.
编辑:谢谢@TJ克劳德让我的困惑得到澄清.有相同问题的人请阅读已接受的答案以及点击此资源
1> T.J. Crowder..:
是否20
在i <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");
}
}
}
}
...然后编译它,并通过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处的粗体操作.