Java 在非基本静态数据上使用final修饰符是否会提高性能?

Java 在非基本静态数据上使用final修饰符是否会提高性能?,java,performance,final,primitive,compiler-theory,Java,Performance,Final,Primitive,Compiler Theory,在Java中对非原始静态数据使用final修饰符是否会提高性能 例如: static final Thread t2 = new Thread(new Thread_2()); 与: static Thread t2 = new Thread(new Thread_2()); 我的意思是,原语的static final定义了一个真正的常量,可以很好地使用,因为它的值在编译时是已知的,但是在这种非原语的情况下,final的使用会触发任何优化吗 在这种情况下使用final会有什么作用还是浪费 如

在Java中对非原始静态数据使用final修饰符是否会提高性能

例如:

static final Thread t2 = new Thread(new Thread_2());
与:

static Thread t2 = new Thread(new Thread_2());
我的意思是,原语的static final定义了一个真正的常量,可以很好地使用,因为它的值在编译时是已知的,但是在这种非原语的情况下,final的使用会触发任何优化吗

在这种情况下使用final会有什么作用还是浪费


如果JVM知道某个值永远不会改变(例如,禁用空检查),那么它可以进行一些优化,因此会带来一些小的性能增益。然而,在几乎所有情况下,这一收益都太小,不值得注意或担心。我对您的程序了解不多,但我想花时间制作变量
final
会更好地用于开发更高效的算法。

如果JVM知道某个值永远不会更改(例如,禁用空检查),那么它可以进行一些优化,因此会带来一些小的性能增益。然而,在几乎所有情况下,这一收益都太小,不值得注意或担心。我对你的程序了解不多,但我想把时间花在变量
final
上会更好地用于开发更高效的算法。

虽然会有一点性能提升,一些
静态final
值会嵌入到使用它们的类中,在我看来,最大的好处来自于编译器强制执行的意图和设计,即值不会改变——也就是说,收益是给开发人员的

在我看来,骨架/框架代码在各个方面都应该是最好的,不仅仅是性能,还有风格


我鼓励您将所有内容声明为final,除非它确实需要是可变的-也就是说,默认情况下,所有内容都是final的,除非需要其他更改。

虽然可以获得少量性能增益,但一些
静态final
值将嵌入到使用它们的类中,在我看来,最大的好处来自于编译器强制执行的意图和设计,即值不会改变——也就是说,收益是给开发人员的

在我看来,骨架/框架代码在各个方面都应该是最好的,不仅仅是性能,还有风格


我鼓励您将所有内容声明为最终的,除非它确实需要可变,也就是说,默认情况下,所有内容都是最终的,除非需要其他更改。

final
与“性能”无关。它们也不是“在编译时已知的”。@Brian Roach你是什么意思?静态最终原语的值在编译时已知。例如:静态最终int me=10;错过了你陈述中的
static
部分,但这仍然没有真正改变任何事情。
final
与“性能”无关。它们也不是“在编译时已知的”。@Brian Roach你是什么意思?静态最终原语的值在编译时已知。例如:静态最终int me=10;我错过了你陈述中的
静态部分,但这仍然没有改变任何事情。我正在制作一个框架,其他代码将放在这个框架上。我只是想确保这个框架在性能方面尽可能优化。不过,这只是一个理论问题。在每个不变的变量中输入final并不那么耗时。我是一个干净代码的崇拜者,如果可能的话,我想避免使用额外的关键字,但同时我不能忍受使用它们会更快(甚至稍微更快)的可能性;-)@PetrosDrakoulis我也是一个完美主义者,但有时我必须学会克服它,并着眼于全局。尽管如此,如果它们真的从未更改,那么最好将它们标记为final
,不管怎样,那些比我更懂Java的人告诉我,今天的编译器可以判断出一个字段何时不会更改,至少在它不是公共的或者可能是受保护的情况下。因此,如果编译器已经完成了优化,那么您可能根本不会从优化中获得太多好处。“如果出于需要我有一个全局对象,我可能会把它标记为最终对象。”安德鲁拉扎罗斯:是的,我也听到过同样的话。但是最常见的JIT(我想是热点)呢?我正在制作一个框架,其他代码将放在这个框架上。我只是想确保这个框架在性能方面尽可能优化。不过,这只是一个理论问题。在每个不变的变量中输入final并不那么耗时。我是一个干净代码的崇拜者,如果可能的话,我想避免使用额外的关键字,但同时我不能忍受使用它们会更快(甚至稍微更快)的可能性;-)@PetrosDrakoulis我也是一个完美主义者,但有时我必须学会克服它,并着眼于全局。尽管如此,如果它们真的从未更改,那么最好将它们标记为final,不管怎样,那些比我更懂Java的人告诉我,今天的编译器可以判断出一个字段何时不会更改,至少在它不是公共的或者可能是受保护的情况下。因此,如果编译器已经完成了优化,那么您可能根本不会从优化中获得太多好处。“如果出于需要我有一个全局对象,我可能会把它标记为最终对象。”安德鲁拉扎罗斯:是的,我也听到过同样的话。但是最常见的JIT(我想是热点)呢?