代码之家  ›  专栏  ›  技术社区  ›  Vivart

对字符串使用静态变量

  •  5
  • Vivart  · 技术社区  · 15 年前

    以下内容摘自 Best practice: Writing efficient code 但我不明白为什么

    private static String x = "example";
    

    private static final String x ="example";
    

    有人能解释一下吗?

    对字符串使用静态变量

    定义静态字段时 调用的类字段)类型为string, 你可以通过 使用静态变量(不是最终变量) 而不是常量(最终)。这个 对于原始数据,则相反 类型,例如int。

    例如,您可以创建一个字符串 对象如下:

    private static final String x = "example";
    

    对于这个静态常数(用 最后一个关键字),每次 使用常量,一个临时字符串 实例已创建。编译器 删除“x”并将其替换为 字节码中的字符串“example”, 因此,黑莓®®Java®虚拟 计算机执行哈希表查找 每次你提到“x”。

    相反,对于静态变量(no final关键字),创建字符串 曾经。blackberry jvm执行 哈希表查找仅当 初始化“x”,因此访问速度更快。

    private static string x=“示例”;
    

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

    4 回复  |  直到 15 年前
        1
  •  7
  •   Hardcoded    15 年前

    我不知道,但这对我来说是有意义的:

    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都是不同的

        2
  •  2
  •   Peter    15 年前

    课文解释了,读一下就行了。

    但要改写它: 因为它更快。 blackberry jvm更好地使用非最终版本的方式。 因为它的设计风格

        3
  •  1
  •   Juriy    15 年前

    这是黑莓虚拟机的细节。其他虚拟机可能会有不同的做法。

    旁注:在实际遇到性能问题(这称为“过早优化”)之前,不要太注意优化,因为如果这样做,很有可能性能会泄漏到您从未预料到的地方。

        4
  •  0
  •   Romain Hippeau    15 年前

    有一个运行时字符串文本池。当您将字符串创建为final时,jvm会在每次使用时创建字符串的副本。如果字符串不是最终的,则在第一次创建字符串时将其插入字符串文字池,然后从池中查找字符串,这样可以避免复制字符串。