Ana*_*666 1 java memory performance 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");
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是: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");
}
}
Run Code Online (Sandbox Code Playgroud)
所以,如果答案是肯定的,那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");
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,变量值被初始化一次并且我已经放置了我自己的条件,这可能会有一些性能问题,但后来我减少了内存消耗,这可能会使事情变得平稳.
编辑:谢谢@TJ克劳德让我的困惑得到澄清.有相同问题的人请阅读已接受的答案以及点击此资源
是否
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");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
...然后编译它,并通过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处的粗体操作.
归档时间: |
|
查看次数: |
357 次 |
最近记录: |