我正在为Android(Java)写作。
我正在声明int和float是正在进行循环的一部分。
声明后,其中一些不需要更改。
如果我在声明时将它们全部设置为最终,那么事情会更快吗?
[编辑]
谢谢大家。我真的没想到它会做出任何改进,我只是注意到,在浏览了各种大型项目的来源之后,这是相当普遍的。干杯
答案 0 :(得分:9)
事情不会更快。 final
关键字只是编译时的语法糖。
如果它实际上是static final
,那么您可以利用编译时计算和任何引用中的值内联。所以,举例来说:
private static final long ONE_WEEK_IN_MILLIS = 7 * 24 * 60 * 60 * 1000L;
public void foo(Date date) {
if (date.getTiem() > System.currentTimeMillis() + ONE_WEEK_IN_MILLIS) {
// No idea what to do here?
}
}
编译器将优化一个和另一个,以便它最终像:
private static final long ONE_WEEK_IN_MILLIS = 604800000L;
public void foo(Date date) {
if (date.getTiem() > System.currentTimeMillis() + 604800000L) {
// No idea what to do here?
}
}
如果您运行反编译器,您将自己看到它。
答案 1 :(得分:1)
尽管设置为final可能会对速度产生影响,但每个VM或设备的答案很可能会有所不同。
然而,宣布他们是最终的并没有受到伤害,人们甚至可以称之为良好的编程风格。
至于性能,这看起来几乎肯定是过早优化。配置文件,找到瓶颈,重新考虑您的算法。不要因为性能而浪费你的“最后”时间 - 它几乎不会解决任何问题。
答案 2 :(得分:1)
如果你也使它静态(一个类变量)它可以提高性能,对你知道不会改变的变量使用final也是一个很好的编程习惯。虽然,你可能不希望它是一个类变量,在这种情况下,我不确定是否可以提高性能,但我认为它可能在很多情况下。
http://docs.sun.com/app/docs/doc/819-3681/6n5srlhjs?a=view
当您将常量声明为静态最终变量时,动态编译器可以轻松执行一些常量折叠优化。
如果方法中未修改方法参数,则声明方法参数final。通常,如果所有变量在初始化后未被修改或设置为某个值,则声明所有变量为final。
因此,例如,如果您的代码是两个最终变量的倍数,那么在运行期间,VM可能会使用通常为睡眠/停机时间来计算该乘法的结果,因此它不必执行此操作在繁忙的时期。
答案 3 :(得分:0)
我认为将变量设为最终是一个好习惯(你可以使用Eclipse的首选项> Java>代码风格>清理这样做)。虽然性能可能实际上有所改善,但我预计差异可以忽略不计。在我看来,它有助于代码的可读性(即不需要查找赋值),这肯定是一件好事(tm)。
答案 4 :(得分:-1)
当我们声明任何变量final时,意味着在编译时它将被识别并且在运行应用程序时JVM不会检查它是否有任何操作,因为它被声明为final(常量)。所以我们肯定会从JVM中删除开销。
所以我们可以说它会提高性能,如果取决于你的情况是变量是常数使其最终 如果你制作静态最终的话会更好.....
它们由JVM优化保存在常量池中,类文件为“http://negev.wordpress.com/java-memory-brief/”