当前位置: 首页 > 面试题库 >

在Java中使用final关键字是否可以提高性能?

仲孙献
2023-03-14
问题内容

在Java中,我们看到了很多final可以使用该关键字但很少使用的地方。

例如:

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

在上述情况下,str可以,final但是通常不这样做。

当一个方法永远不会被覆盖时,我们可以使用final关键字。类似地,对于不会被继承的类。

在任何或所有这些情况下使用final关键字是否真的可以提高性能?如果是这样,那又如何?请解释。如果final对性能的正确使用确实很重要,那么Java程序员应该养成什么习惯来充分利用关键字?


问题答案:

通常不会。对于虚拟方法,HotSpot会跟踪该方法是否实际上已被覆盖,并能够执行优化,例如在假设方法未被覆盖的情况下进行内联-直到它加载了覆盖该方法的类为止。它可以撤消(或部分撤消)那些优化。

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

我认为你应该final基于清晰的设计和可读性而不是出于性能原因而使用。如果出于性能原因要进行任何更改,则应在使最清晰的代码变形之前执行适当的测量-这样,你可以确定所实现的任何额外性能是否值得较差的可读性/设计。(根据我的经验,这几乎是不值得的; YMMV。)

编辑:正如最后提到的领域,值得一提的是,就清晰的设计而言,它们通常还是个好主意。它们还改变了跨线程可见性的保证行为:构造函数完成后,保证任何最终字段都将立即在其他线程中可见。这可能是final我经验中最常见的用法,尽管作为乔什·布洛赫(Josh Bloch)的“继承设计或禁止继承设计”经验法则的支持者,我可能应该final更频繁地在类上使用它。



 类似资料:
  • 问题内容: 尽管在Java中使用’final’关键字有很多原因,但我不断反复听到的一个原因是它使您的代码更安全。尽管在这种琐碎的情况下这似乎很有意义: 使用final关键字,您希望没有恶意代码能够更改变量passwordHash。但是,使用反射可以更改passwordHash字段上的最终修饰符。 那么“最终”是否提供任何真正的安全性,还是仅仅是安慰剂? 编辑: 有一些非常有趣的讨论,我希望我可以接

  • 问题内容: Kotlin是否可以提高性能?有基准测试吗?Kotlin比Java快吗?我在Kotlin网站上找到了这个。https://kotlinlang.org/docs/reference/comparison- to-java.html 谈论语言功能而不是性能。 问题答案: Kotlin生成的字节码与Java非常相似,因此Kotlin代码的性能在大多数情况下与等效Java代码的性能相同。 内

  • 问题内容: 假设我有以下示例: 例子一 现在,可能是: 例子二 关键不是实际的代码,而是使用一次以上,两次/三次或三次以上的时间。 上午我更好的性能,明智使用 例如两个 比 例如一个 (也许与解释为什么或者为什么不)? 编辑/注意 我怀疑两个更好。当我不可避免地忘记将事件处理程序添加到事件处理程序时,我有点担心的是在添加代码,而不是无意中引入了一个潜在的难以诊断的错误。那么我应该使用还是为此? 谢

  • 问题内容: 似乎几乎没有人意识到这一点,但是Java中的“ thisreference”是最终的。在正常的编程天中,我认为可以通过在自己的类中重新定义此引用来重新定义整个实例: 为什么此引用在Java中是最终的? 问题答案: 问题不在于它是参考,而是它本身根本不是参考。是一个 关键字 ,“表示一个值,该值是对为其调用实例方法或默认方法的对象的引用”(JLS§15.8.3)。 此外,从可以重新分配变

  • 本文向大家介绍详解Java中的final关键字的使用,包括了详解Java中的final关键字的使用的使用技巧和注意事项,需要的朋友参考一下 final含义 final是Java中的一个保留关键字,可以声明成员变量、方法和类。一旦你将引用声明为final类型,你将不能再改变这个引用了。编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。 final变量 凡是对成员变量或者本地变量(

  • 我正在使用StringToWordVector朴素贝叶斯和StringToWordVector对一些文本进行分类。我还使用TD/IDF对单词进行评分。 在训练过程中,有没有一种简单的方法来增加一些单词(我自己选择)的分数,从而增加这些单词在给定课程模型中的权重?因此,如果这些单词出现在一个新文档中,分类器就会知道该文档属于此类的可能性更大。 谢谢