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

标签 java performance loops scope declaration

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

考虑

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/

相关文章:

java - 如何使用 JavaHg 获取工作文件夹信息?

java - 是否有用于 java 的反汇编器 + 调试器(用于汇编器的 ala OllyDbg/SoftICE)?

for循环中的javascript 'let'和 'var'

javascript - 使用 Jquery 通过 Div 循环 Div

java - 陷入 HashMap Collection 的实现中

java - 驱动程序类做什么(数组)

c++ - 我正在尝试做的最有效的树结构

javascript - 为什么 `exp && "t"|| "f"` 比 inline-if-else 慢很多?

java - 程序不会在 while 循环中进入 try block

c - 我在 C 中的 for 循环中遇到了麻烦