gpt4 book ai didi

java - 循环内声明的变量是否受单次迭代的范围限制?

转载 作者:搜寻专家 更新时间:2023-11-01 03:36:46 25 4
gpt4 key购买 nike

我知道这听起来微不足道,但我只想理清头绪..

考虑

for (int i = 0; i < 100; i++) {
int x=i;
System.println(i);
}

是为每次迭代创建和分配内存的新 int 还是编译器巧妙地推断场景并仅创建一次并更改其值(因为它知道这是一个循环),

就方法签名中的i 声明而言,它显然只创建一次对吧?

也会

int x = 0;

for (int i = 0; i < 100; i++) {
x = i;
System.println(i);
}

真的比上面那个更有效率吗?

在 java 中,如果我不需要在循环外访问 x,是否最好在循环内声明它,这是一个好的做法吗?

最佳答案

您可以比较两种情况下创建的字节码。

在循环外声明变量:

public static void main(String[] args) {
int x;
for (int i = 0; i < 100; i++) {
x = i;
}
}

结果:

public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_2
2: iload_2
3: bipush 100
5: if_icmpge 16
8: iload_2
9: istore_1
10: iinc 2, 1
13: goto 2
16: return

在循环内声明变量时:

public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
int x = i;
}
}

给予:

public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: bipush 100
5: if_icmpge 16
8: iload_1
9: istore_2
10: iinc 1, 1
13: goto 2
16: return

如您所见,字节码几乎完全相同。唯一的区别是,在第一种情况下,x 是变量 1,i 是变量 2,而在第二种情况下,x 是 2 并且i 为 1。因此,就性能而言,这两个代码是等效的。

现在,关于设计,最好尽可能限制变量的范围。因此,在循环内声明 x 可能更可取。

关于java - 循环内声明的变量是否受单次迭代的范围限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29279646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com