在Java中使用final关键字会提高性能吗?

问题:

在Java中,我们看到很多可以使用final关键字的地方,但它的使用并不常见。
例如:

String str = "abc";
System.out.println(str);

在上述情况下,str可以是final,但这通常被忽略。
当一个方法永远不会被覆盖时,我们可以使用final关键字。类似地,在不会被继承的类的情况下。
在任何或所有这些情况下使用final关键字是否真的提高了性能?如果是这样,那怎么办?请解释。如果final的正确使用对于性能来说真的很重要,那么Java程序员应该采用哪些习惯才能充分利用关键字?

回答:

通常不会。对于虚拟方法,HotSpot会跟踪该方法是否已被覆盖,并且能够执行优化,例如assumption内嵌一个方法尚未被覆盖 – 直到它加载覆盖该方法的类,此时它可以撤销(或部分撤销)这些优化。
(当然,假设你使用的是HotSpot,但是它是迄今为止最常见的JVM,所以…)
在我看来,您应该使用final,基于清晰的设计和可读性,而不是出于性能原因。如果您想为了出于性能原因而更改任何内容,则应该在将最清晰的代码变成形状之前进行适当的测量,这样可以决定是否有更高的可读性/设计值得实现。 (在我的经验中,几乎从来不值得; YMMV。)
编辑:由于已经提到了最后的领域,值得一提的是,无论如何,在清晰的设计方面,它们往往是个好主意。它们还可以根据跨线程可见性更改保证的行为:在构造函数完成后,任何最终字段都将保证在其他线程中立即可见。这可能是我经验中final的最常见的用法,尽管作为Josh Bloch的“继承或禁止设计”经验的支持者,我应该更经常地使用final进行类…

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Does use of final keyword in Java improve the performance?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

52 − = 45