我正面临一个混乱的希望,任何人都可以回答。请参阅以下代码
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答案 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处的粗体操作。