可能重复:
Is there any performance reason to declare method parameters final in Java?
Does use of final keyword in Java improve the performance?
所以有一个类级别的对象变量,它是在创建对象时分配的,并且在对象的生命周期内保持不变:
class MyClass
{
private Rect rc = new Rect();
//...
}
我获得了什么声明final
?方法级变量的问题相同。
答案 0 :(得分:3)
它完全是针对具体实现的。
使用final的主要原因是确保不允许变量值随时间变化。这是代码逻辑而不是优化的问题。
答案 1 :(得分:1)
最终声明变量确实具有来自不变性的好处。如果使用得当,你的代码可以更加线程安全,前提是你正在制作的变量没有内部状态,可以意外地改变并影响其他线程。
在这里也可以看到有关JVM优化的其他答案。
答案 2 :(得分:1)
Final有一个显而易见的用途,它使对象/变量不可变,现在这个功能有助于提高性能吗?
引用:The Final Word On the final Keyword,您使用final获得的性能提升是:
不需要重新加载字段,因为它的值是 保证永远不会改变。
但是我在上面的语句中看到了一个缺陷,如果它只设置一次并且最终保证它永远不会再次重新加载,则不会重新加载该值,但这并不意味着使用final会直接帮助您提高性能,我们在这里获得的性能提升是由于如果我们确保不设置其他东西,那么无论如何都不会重新加载。
所以,你回答: 虽然它是特定于JVM的实现,并且至少在HotSpot中,但是使用final不会带来任何性能提升。阅读更多:Does use of final keyword in Java improve the performance?
IBM也says你将无法获得最终的蚂蚁表现。
答案 3 :(得分:0)
这可能不会给你100%的回答。但我有一点我知道。
当你将变量声明为final时,jvm会获得很多优化。
我记得一个很好的例子,我在我的程序中有if-else条件,因为我使用了final变量,complier已经评估了if-else的哪一部分是有效的,它剥离了其他行,我已经看到了它与javap。我很快就会告诉你那个例子。
答案 4 :(得分:0)
它允许通过memoization进行一些优化。例如,如果你有一个具有最终高度和最终宽度的Rectangle类,那么你的矩形区域函数只需要计算一次,因为它知道高度和宽度不能改变。
答案 5 :(得分:0)
我怀疑最终字段会对性能产生影响,除非您在多个线程中共享对象。 然而,声明方法final或even类将有助于jit确定方法可以被覆盖,或者不能。如果jit确定方法是否覆盖,则可能会删除方法查找并使用直接跳转(跳转子例程)。 Jits也喜欢内联小的最终方法。
答案 6 :(得分:-1)
除了对修改(*)的明显编译时保护之外,您还可以获得对其值的某种形式的优化访问。例如,编译器可以用文字值替换原始变量的引用。运行时可以例如将其内容的副本放在每个线程的私有内存空间中,以避免访问主内存。它确实依赖于每个JVM实现。
对于局部变量,您在编译时和运行时都会再次获得收益,主要是以线程访问优化的形式。但请记住,您只会在代码的热点中注意到这些增益,代码每秒执行数百或数千次。
(*)final仅在引入可访问对象后才能防止编译时修改。