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

例如:

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

在上述情况下,str可以是final,但这通常被忽略.

当一个方法永远不会被覆盖时,我们可以使用Final关键字.类似地,对于不会被继承的类也是如此.

在任何或所有这些情况下使用final关键字真的能提高性能吗?如果是的话,那怎么办?请解释一下.如果正确使用final对性能真的很重要,那么Java程序员应该养成哪些习惯来充分利用关键字?

推荐答案

通常不会.对于虚拟方法,HotSpot跟踪该方法是否已被重写,并能够执行优化,例如对尚未重写的方法进行内联,直到加载重写该方法的类,此时它可以undo撤消(或部分undo撤消)这些优化.

(当然,这是假设您使用的是HotSpot——但它是迄今为止最常见的JVM,所以…)

在我看来,你应该基于清晰的设计和可读性,而不是出于性能的原因使用final.如果出于性能原因想要更改任何内容,那么在使最清晰的代码变形之前,应该进行适当的测量——这样,您就可以决定是否值得以较差的可读性/设计来实现任何额外的性能.(以我的经验,这几乎不值得;YMMV.)

编辑:正如前面提到的最后几个字段,就清晰的设计而言,它们通常都是一个好主意,这一点值得提出来.它们还改变了跨线程可见性方面的保证行为:在构造函数完成之后,任何最终字段都保证在其他线程中立即可见.根据我的经验,这可能是final最常见的用法,尽管作为Josh Bloch"要么为继承而设计,要么禁止它"的经验法则的支持者,我可能应该在类中更多地使用final……

Java相关问答推荐

将状态栏和导航栏设置为白色,带有深色文本

如何计算内循环的时间复杂度?

@ EnableRouting注释在Kotlin项目中不工作

Java中不同包中的类之间的配置共享

为什么不应用类型推断?

SpringBoot+Java 17@Valid未验证POJO

如何使用带有谓词参数的方法,而不使用lambda表达式

如何在Java记录中设置BigDecimal类型属性的精度?

格式中的特定回录键-值对

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

使用htmlunit和java单击按钮

没有使用Lombok生成的参数

如何在@CsvSource中传递空格作为值

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

嘲笑黄瓜中的对象

视图被推出线性布局-Android

如何设计包含已知和未知键值对映射的Java类?

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

在WHILE()循环初始化部分中声明和初始化变量的Java语法?

java 11上出现DateTimeParseException,但java 8上没有