java - 为什么 javac 有时会创建不必要的变量副本?

标签 java javac bytecode

我有这样的代码:

boolean[] array = new boolean[200];
int[] indexes = {10, 42, 62, 74};
while(true) {
    //some code here
    StringBuilder sb = new StringBuilder();
    for (int j : indexes) {
        sb.append(array[j] ? '1' : '0');
    }
}

字节码:

ASTORE 3 //"indexes" array
...
ALOAD 3
ASTORE 8
ALOAD 8
ARRAYLENGTH
...

我不确定为什么 javac 将 ref 复制到数组到另一个本地变量中。

最佳答案

for-each 循环被转换成这样:

{
    int[] hidden_array_ref = indexes;
    int hidden_length = hidden_array_ref.length;
    for(int hidden_counter = 0; hidden_counter < hidden_length; hidden_counter++) {
        int j = hidden_array_ref[hidden_counter];
        sb.append(array[j] ? '1' : '0');
    }
}

请特别注意 int[] hidden_​​array_ref = indexes;。这就是您要问的副本。

编译器是这样做的,所以如果你写这样的话:

for(int j : indexes) {
    indexes = new int[0];
    sb.append(array[j] ? '1' : '0');
}

indexes 的赋值不会影响循环。

关于java - 为什么 javac 有时会创建不必要的变量副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29551200/

相关文章:

java - 无法找到或加载从 Linux 终端调用的主类

java - JVM 是生成字节码还是运行字节码?

java - 各种增量运算符 vs 赋值和自增分析

java - 在 Java 中使用 Gson 解析来自 HTTP 请求的 JSON 响应

java - 在windows 8命令行上编译Junit报错

java - 如何编译多个相互依赖的java文件?

Java(或字节码)AST 生成器是否可用,以便我可以在其结果之上运行几个 Visitors?

Java 8 - 三元运算符返回函数不编译

java - 如何找出设备中存在的广告垃圾?

java - 阻止 java 请求接受连接的权限