以下内容摘自最佳实践:编写高效代码但我不明白为什么
private static String x = "example";
比...快
private static final String x ="example";
谁能解释一下这一点。
对字符串使用静态变量
当您定义静态字段时(也
称为字符串类型的类字段,
您可以通过以下方式提高应用程序速度
使用静态变量(非最终变量)
而不是常量(最终)。这
对于原始数据则相反
类型,例如 int。
例如,您可以创建一个字符串
对象如下:
private static final String x = "example";
对于这个静态常数(表示为
最终关键字),每次您
使用常量,一个临时字符串
实例已创建。编译器
消除“x”并将其替换为
字节码中的字符串“example”,
以便 BlackBerry® Java® Virtual
机器执行哈希表查找
每次您引用“x”时。
相反,对于静态变量(没有
Final 关键字),创建字符串
一次。 BlackBerry JVM 执行
仅当满足以下条件时才进行哈希表查找
初始化“x”,因此访问速度更快。
private static String x = "example";
您可以使用公共常量(即
最后字段),但您必须标记
变量为私有。
我不知道这一点,但这对我来说很有意义:
JVM 有一个内部字符串文字缓存。每次使用文字创建字符串时,JVM 都必须在缓存中查找它,如果不存在,则存储它。
现在,编译器可以使用字符串文字内联最终变量,因为它在编译时是已知的,并且对于性能来说这似乎是一个好主意。
所以你的代码:
static final String CONST = "myconst";
...
if (CONST.equals(aVar))
...
case CONST
...
被编译器重写为:
static final String CONST = "myconst";
...
if ("myconst".equals(aVar))
...
case "myconst"
...
如果 JVM 实现不够聪明,在本例中它需要查找“myconst”三次。
当您不将 CONST 标记为“final”时,编译器无法“优化”它,因为变量可以在运行时更改。您的代码将以 1:1 的方式进行编译,并且 JVM 只需要在变量处查找对象。
顺便说一句:糟糕的 JVM 实现不应该定义您的编码风格。 “final”提供了很大的安全性,因此只要它不会真正影响您的性能:不要关心它是否会提高或降低您的速度 - 无论如何,它对于下一个 JVM 来说是不同的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)