Java 静态/实例方法优化

标签 java optimization static jvm final

在 Java 中是未修改方法变量,缺少final, 每次都重新初始化限定符

  1. 静态方法
  2. 实例方法

如果 1. 或 2.(或两者)的答案是 final 限定符 允许 Java 执行优化并存储方法 变量只有一次?

如果答案取决于变量的类型, 变量优化/未优化?例如,是 Stringint 优化而 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
    }

    ...
}

最佳答案

无论是 static 方法还是 final 变量或两者,都没有区别。局部变量的范围意味着每次都会发生这种赋值(除了优化*)。

但是,当涉及到您示例中的字符串时,这些字符串将来自 string pool .所以赋值每次都会发生,但它们都会引用相同的 string 实例。

*优化 - JIT compiler可以内联这些值,因此每个解决方案的运行速度可能与另一个解决方案一样快。因此,除非您意识到实际的性能问题,否则不应尝试对自己进行微优化。

关于Java 静态/实例方法优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37157002/

相关文章:

java - 如何确定一周中周五和周日之间特定时间的日期

c# - 为什么这个线程方法需要 900 毫秒才能完成?

android - 在android中使用静态变量

iphone - 如何在 Objective C 中使用静态变量(BOOL)

c# - 使用静态方法生成随机数是一种好习惯吗?

Java 实体错误 - 主键为空

java - 如何计算函数在范围内的最大值?

java - 在 Jackcess 中对表格进行排序

sql - 有没有办法优化我的 bigquery sql 以便运行得更快?

c++ - 如何通过组合红色和蓝色无符号字节来优化混合?