Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我将变量设置为最终变量,事情会运行得更快吗?_Java_Android - Fatal编程技术网

Java 如果我将变量设置为最终变量,事情会运行得更快吗?

Java 如果我将变量设置为最终变量,事情会运行得更快吗?,java,android,Java,Android,我是为Android(Java)编写的 我声明int和float是正在进行的循环的一部分 其中一些在声明后不需要更改 如果我在声明时将它们全部设置为final,事情会运行得更快吗 [编辑] 谢谢大家。实际上我并不期望它会有任何改进,我只是注意到,在浏览了各种大型项目的源代码之后,它相当普遍。欢呼:< p>我认为把变量变成最终的一个好的实践(你可以使用Eclipse的首选项> java >代码风格>清理来完成。虽然性能实际上可能会提高,但我认为差异可以忽略不计。在我看来,它有助于提高代码的可读性(

我是为Android(Java)编写的

我声明int和float是正在进行的循环的一部分

其中一些在声明后不需要更改

如果我在声明时将它们全部设置为final,事情会运行得更快吗

[编辑]


谢谢大家。实际上我并不期望它会有任何改进,我只是注意到,在浏览了各种大型项目的源代码之后,它相当普遍。欢呼:

< p>我认为把变量变成最终的一个好的实践(你可以使用Eclipse的首选项> java >代码风格>清理来完成。虽然性能实际上可能会提高,但我认为差异可以忽略不计。在我看来,它有助于提高代码的可读性(即无需查找赋值),这当然是一件好事(tm)。

虽然设置为final可能会影响速度,但每个VM或设备的答案可能会有所不同

然而,将它们声明为final并没有什么坏处,人们甚至可以称之为良好的编程风格


至于性能,这看起来几乎肯定像是过早优化。分析、发现瓶颈、重新思考算法。不要因为性能问题而浪费时间在“最终”上——它几乎解决不了任何问题。

事情不会进展得更快。
final
关键字只是编译时的语法糖


如果它实际上是
静态final
,那么您可以利用compiletime计算和任何引用中的值内联。因此,例如:

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?
    }
}

如果您运行反编译器,您将自己看到它。

如果您还将其设置为静态(类变量),则可以提高性能,并且对于您知道不会更改的变量使用final也是一种很好的编程实践。虽然,您可能不希望它成为类变量,在这种情况下,我不确定是否可以提高性能,但我认为在许多情况下可能会这样

当您将常量声明为静态最终变量时,动态编译器可以轻松执行一些常量折叠优化

如果方法参数未在方法中修改,则将其声明为final。通常,如果初始化或设置为某个值后未修改所有变量,则将其声明为final


例如,如果您的代码将两个final变量相乘,那么在运行时,VM可能会使用通常的休眠/停机时间来计算相乘的结果,这样它就不必在繁忙时段执行相乘操作。

当我们声明任何final变量时,意味着在编译时它将被识别,并且在运行应用程序时,JVM不会检查它是否有任何操作,因为它被声明为final(常量)。因此,我们明确地从JVM中移除了开销

因此,我们可以说,它将提高性能,如果取决于您的情况,变量是常量,则将其设置为最终值 最好是使if静态最终


JVM对它们进行了优化,并将它们与类文件“”一起保存在常量池中。

试试看。做一个愚蠢的速度测试:对所有类型(原语、字符串、原语的包装类等)调用100000次getter。这不是一种可靠的测试方法。虚拟机上的微基准测试很少是这样。微基准测试几乎是虚拟机的根源evil@Martijn:实际上,您基本上是在对VM进行基准测试,而不是对代码进行基准测试。另请参见,解释为什么性能可能会提高?是否有一些优化依赖于“final”属性?final属性可以在编译时检查是否存在冲突,因此如果编译器无论如何都不能进行这些优化,我会感到惊讶……编译器可能会在有限的范围内进行优化,但“final”是一个很好的明确提示。但由于编译器或VM最好被视为一个黑匣子,因此没有理由不给它一个提示,更不用说假设它进行了一些优化。因为它可以决定编译时间,如果在变量前面放“final”是否有效,它可以试着在每个变量前面放final,如果合法的话,也可以进行这些优化,是吗?因为公共静态变量和公共实例变量不能被安全地假定为最终变量,所以编译器永远不能假定它们是最终变量。如果将反射引入到混合中,则无法使用实例或静态变量。但我说它“可能”会改善。当我认为一个潜在的性能差异可以忽略不计时,我并不在乎它是否存在。我喜欢可读性的提高,这对我来说更重要。@aioobe:这是我从任何人那里看到的最好的论据之一。反射就是为此我最喜欢的API<代码>私有最终字段,你说~反射魔法~不再是了!我也喜欢Javassist作为最终类,因为同样的原因,没有什么比向
java.lang.*
类注入新方法更有趣的了:D@BalusC:“事情不会运行得更快。”——这通常是正确的,但Android的Java实现中有一些真正有趣的东西可能会使这成为一个例外。不知怎的,你会如何覆盖最后一个关键字?我刚试过,但收到了
java.lang.IllegalAccessException:Can not set static final java.lang.String field Main$Foo.BAR为java.lang.String
抛出的
throwFinalFieldIllegalAccessException
@sfusseneger:
静态final
(编译时间常数)与
final
非常不同,我想我记得。可以使用反射设置最终实例变量。然而,对它们的访问通常是内联的。因此,
field.get(obj)
foo.field
返回不同的结果。Funky stuff:)注意:
static final
(compiletime常量)与
final
非常不同。是的,我编辑了我的帖子:)但是如果循环使用静态final变量,则没有固有的问题。
final
变量也可以在方法范围内声明(I