final
关键字(使字段或参数不变,防止子类化或方法的重写)。可能重复: Does use of final keyword in Java improve the performance?
final修饰符在Java中具有different consequences,具体取决于您将其应用于什么。我想知道的是additionally是否可以帮助编译器创建更有效的字节码。我想这个问题深入到JVM的工作方式,并且可能是特定于JVM的。
因此,就您的专业知识而言,以下任何一项对编译器有帮助吗,还是仅出于正常的Java原因而使用它们?
谢谢!
编辑:感谢您的所有回答!请注意,正如@Zohaib所建议的,我的问题是this的重复项。发布之前,我的搜索不够好。我不会删除它,因为你们做出了很大的贡献,但是答案可以合并。除非另有说明,否则我将决定“投票关闭”系统。
如果使用final
,字节码的效率不会显着提高或降低,因为Java字节码编译器通常在优化方式上做得很少。效率奖励(如果有)将在JIT编译器生成的本机代码中[<1。
final
为JIT编译器提供了提示,该提示应有助于对其进行优化。实际上,最新的HotSpot JIT编译器可以通过忽略您的提示来做得更好。例如,现代的JIT编译器通常执行全局分析,以找出给定的方法调用是否是在应用程序当前加载的类的上下文中对叶方法的调用。此分析比您的final
提示更准确,并且运行时甚至可以检测到何时加载了使分析无效的新类...并为受影响的代码重做分析和本机代码生成。使用final
还有其他语义后果:
final
可以防止您意外更改它。 (并向读者表达您的意图。)final
可以防止在子类中重写。final
会完全阻止子类化。final
阻止子类对其进行更改。final
对线程安全有重要影响;参见JLS 17.5。final
时需要考虑这一点。因此,最佳实践是使用final
来表达您的设计意图,并获得所需的其他语义效果。如果仅将final
用作优化提示,则不会有太大的成就。
final
可能
会导致某些平台上的较小性能改进。final
会更改字节码编译器处理该字段的方式。我在上面举了一个例子。另一种是“常量变量”情况(JLS 4.12.4),其中在当前类和其他类中,字节码编译器都会内联static final
字段的值将],这会影响观察到的行为。码。 (例如,引用常量不会触发类初始化。因此,添加final
may
final
可能会允许对JIT编译器进行较小的优化,否则将无法完成优化。但是,JIT编译器也可以将任何可以声明为final could
的字段推断为有效的final。 (尚不清楚JIT编译器实际上是否会这样做,以及是否会影响所生成的本机代码。)final
来表达您的设计意图,而不是作为优化提示。1-该答案假设我们正在谈论具有良好JIT或AOT编译器的最新JVM。 1)最早的Sun Java实现根本没有JIT编译器。 2)早期的Android Java实现使用的编译器在优化方面做得很差。确实,早期的Android开发人员文档建议采用各种源代码级的微优化来弥补这一不足。此建议已被删除。
final
关键字(使字段或参数不变,防止子类化或方法的重写)。您遇到的另一个问题是,JVM一直在不断改进,而在此之前已不再起作用的一个大窍门。例如在Java 5.0中,Lock
比synchronized
快得多,但是在Java 6中,差异很小,并且synchronized
可以更快。
通常,使您的代码简单,清晰且易于维护是一个好主意,这也将提高代码效率。
final
关键字(使字段或参数不变,防止子类化或方法的重写)。您遇到的另一个问题是,JVM一直在不断改进,而在此之前已不再起作用的一个大窍门。例如在Java 5.0中,Lock
比synchronized
快得多,但是在Java 6中,差异很小,并且synchronized
可以更快。