在Java中有未修改的方法变量,这些变量缺少final,限定符每次在
如果1.或2.的答案(或两者兼而有之),final限定符是否允许Java执行优化并只存储一次方法变量?
如果答案取决于变量的类型,那么哪种类型的变量是优化的/未优化的?例如,String、int是优化的,而Map没有优化吗?
比较而言,Java只存储一个静态类变量,如
private static final String foo = "Teenage Mutant Ninja Turtle";一次。澄清:问题是是否
1:
static SomeReturnValueOrVoid SomeMethod() {
// 1.a Not modified, is this reinitialized each method call?
String foo = "Teenage Mutant Ninja Turtle";
// 1.b Marked final, is this reinitialized each method call?
final String bar = "Teenage Mutant Hero Turtle";
}2:
SomeReturnValueOrVoid SomeMethod() { // not static
// 2.a Not modified, is this reinitialized each method call?
String foo = "Teenage Mutant Ninja Turtle";
// 2.b Marked final, is this reinitialized each method call?
final String bar = "Teenage Mutant Hero Turtle";
}等于
3:
class SomeClass {
static final String foo = "Teenage Mutant Ninja Turtle";
SomeReturnValueOrVoid SomeMethod() {
// Uses foo
}
static SomeReturnValueOrVoid SomeMethod() {
// Uses foo
}
...
}发布于 2016-05-11 08:56:18
无论是static方法还是final变量,或者两者兼而有之,都没有区别。局部变量的作用域意味着这个赋值每次都会发生(除了优化的时候*)。
但是,当涉及到示例中的字符串时,字符串将来自字符串池。因此,赋值每次都会发生,但它们都将引用相同的string实例。
*优化-- JIT编译器可能会内联这些值,因此每个解决方案的运行速度可能与另一个相同。因此,除非您意识到实际的性能问题,否则不应该尝试对自己进行微优化。
发布于 2016-05-11 09:04:49
在Java中有未经修改的方法变量,这些变量没有每次重新初始化最后的限定符。
(调用该方法)--当然是,否则它们将未初始化。
我想你真正想问的是,这个初始化能不能在某种程度上得到优化?如果为变量分配了一个常量值,那么是的;JIT编译器可能会完全删除变量,并用它的(已知常量)值替换对它的引用。
最终限定符是否允许Java执行优化并只存储一次方法变量?
不是的。final-qualified局部变量不能更改其值,但方法的每次调用都有它自己的变量副本,不同的实例化可能对同一个final变量使用不同的值。考虑:
void someMethod()
{
final int number = new Random().nextInt();
}在程序执行期间,不能只分配一次该值,因为每次调用该方法时,它都是不同的。
局部变量上的final修饰符对优化几乎没有或没有直接影响。它只对变量所能做的操作设置限制--对任何变量都可能遵循的限制,而不管final限定条件如何--而这反过来又允许某些优化。如果优化器值得它的salt,它不会关心变量是否声明为final,而是考虑它是否是有效的常量。
https://stackoverflow.com/questions/37157002
复制相似问题