Java编译器通常预先计算最终字段的哈希码吗?

Byr*_*ins 3 java compiler-construction optimization

我有一个HashMap密集的Java程序,其中几个类具有从final字段计算的哈希码.例如:

public class Foo {
    private final int bar;
    private final String zot;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + bar;
        result = prime * result + zot.hashCode();
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器可以观察到对象初始化后哈希码不能改变,并将其预先计算到附加private final字段中.当前的Java编译器是否像Oracle JDK 7中那样执行此操作?我可以解散.class文件,但是JIT也可能在运行时进行这种优化,我不会在那里看到它.无论如何,我对除此之外的其他情况感兴趣,因此找到一种识别编译器自动执行的任何优化的通用方法会很棒.

Pet*_*rey 6

当前的Java编译器是否像Oracle JDK 7中那样执行此操作?

javac几乎没有任何优化.

我可以解散.class文件,

您可能不喜欢在优化方面看到的内容.;)

但是JIT也可能在运行时进行这种优化,我不会在那里看到它.

如果JIT确实对此进行了优化,那么你就不会看到它,事实上它并没有这样做.这就是为什么String在运行时缓存它的hashCode(),显式地在代码中.

  • @ByronHawkins:每个对象浪费额外的四个字节可能对分配大量这些对象的程序不利.因此,对于JVM来说,这不是一个安全或理智的事情. (2认同)