java - Java 8 中的编译器是否将有效的最终变量解释为最终变量?

标签 java performance compilation final

当我使用 lambda 表达式或匿名内部类以及外部类的变量时,我经常会遇到编译时错误:

Lamba 表达式:

local variables referenced from a lambda expression must be final or effectively final

内部类:

local variables referenced from an inner class must be final or effectively final


这意味着Java 8中的编译器能够推断变量是否是隐式final的。
关于this问题,使用最终变量而不是非最终变量有时会对性能产生巨大的积极影响。
我的问题是:
Java 8 中的编译器是否将最终变量有效解释为最终变量,然后在运行时将其用作最终变量?
因此,它是否会进行与最终变量相同的优化?

关于有效最终和最终(即 this )之间差异的问题与它必须是有效最终但没有说出任何回答我的问题的原因有关。

如果有任何答案,我将不胜感激。

最佳答案

Does compiler in java 8 interpret effectively final variables as final variables and later, in runtime use it as final?

这两种情况的答案都是肯定的。

后者的原因是类文件格式没有提供一种方法来说明局部变量是否声明为final。因此,如果 JIT 编译器要基于最终性进行优化,则必须从方法的字节码实际执行的操作来推断最终性;即有效的最终性。

关于java - Java 8 中的编译器是否将有效的最终变量解释为最终变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40054717/

相关文章:

ruby - 检查字符串是否与 ruby​​ 中的正则表达式匹配的最快方法?

c++ - 如何使用 -fPIC 重新编译

python - 使用 pyinstaller 文本无法解码

java - 如何更快地从 Selenium WebElement 获取值?

java - 使用 Jersey 和 JSON,如何忽略根元素?

c++ time() 函数在 solaris 中的性能

Python:处理平均时间,第一个/第二个慢得多

angularjs - 有什么方法可以使用指令动态添加 ng-model-options 吗?

java - 解析 HTML 并在 HTML 文本中换行

java - 如何增加 Accumulo 代理服务器上的内存?