为字符串使用静态变量

Viv*_*art 5 java blackberry

以下内容取自 最佳实践:编写高效代码, 但我不明白为什么

private static String x = "example";
Run Code Online (Sandbox Code Playgroud)

比...快

private static final String x ="example";
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释一下.

为字符串使用静态变量

当您定义String类型的静态字段(也称为类字段)时,可以通过使用静态变量(而不是final)而不是常量(final)来提高应用程序速度.对于原始数据类型(例如int)则相反.

例如,您可以创建一个String对象,如下所示:

private static final String x = "example";
Run Code Online (Sandbox Code Playgroud)

对于此静态常量(由final关键字表示),每次使用常量时,都会创建一个临时String实例.编译器删除"x"并将其替换为字节码中的字符串"example",以便每次引用"x"时,BlackBerry®Java®VirtualMachine都会执行哈希表查找.

相反,对于静态变量(没有final关键字),String创建一次.BlackBerry JVM仅在初始化"x"时执行哈希表查找,因此访问速度更快.

private static String x = "example";
Run Code Online (Sandbox Code Playgroud)

您可以使用公共常量(即最终字段),但必须将变量标记为私有.

Har*_*ded 7

我没有意识到这一点,但它对我有意义:

JVM具有内部String Literal Cache.每次使用文字创建String时,JVM都必须在缓存中查找它,如果不存在,则存储它.

现在,编译器可以使用String文字内联最终变量,因为它在编译时是已知的,并且它似乎是性能的好主意.

所以你的代码:

static final String CONST = "myconst";
...
if (CONST.equals(aVar))
...
case CONST
...
Run Code Online (Sandbox Code Playgroud)

由编译器重写为:

static final String CONST = "myconst";
...
if ("myconst".equals(aVar))
...
case "myconst"
...
Run Code Online (Sandbox Code Playgroud)

如果JVM实现不够聪明,则需要在此示例中查找"myconst"三次.

如果不将CONST标记为"final",则编译器无法"优化"它,因为变量可能在运行时更改.您的代码将以1:1编译,JVM只需要在变量中查找Object.

顺便说一句:错误的JVM实现不应该定义您的编码风格."final"提供了很多安全性,所以只要它没有真正达到你的性能:不关心它是否会增加或降低你的速度 - 无论如何它对于下一个JVM来说都是不同的