【问题标题】:java access time to variablesjava访问变量的时间
【发布时间】:2023-03-10 21:41:01
【问题描述】:

假设我们有一个包含 1000 个字符串常量的类 Const.java

public static final String foo1 = "foo1";
public static final String foo2 = "foo2";
...
public static final String foo1000 = "foo1000";

现在,另一个类中的某个方法正在执行

String s = Const.foo1000;

变量的访问时间是否取决于此类变量的数量? (也就是说,如果Const.java中有1,000,000个字符串,代码会以同样的速度运行吗?)

【问题讨论】:

  • 不可能在Const.java中声明1,000,000个字符串常量。技术最大值小于 33,000。但是对性能的影响正好为零,如explained by VGR;如果Const 类只包含这些声明,它甚至不会在运行时加载。

标签: java compiler-optimization


【解决方案1】:

访问时间将始终相同。

当应用程序启动时,您的类使用类加载器加载到 RAM 内存中。常量(静态/最终)存储在内存位置中,无论在何处使用,都会在编译时替换代码中的位置。

您应该注意到的唯一区别是在您的应用程序开始时,这将与您在班级中的变量数量成正比。

访问内存位置总是 O(1),就像从 HashMap 中检索对象一样。

【讨论】:

    【解决方案2】:

    是的,它会以相同的速度运行。一个重要的原因是常量都是在编译时解析的,而不是在运行时解析的。

    编译代码时会分析仅包含文字的任何静态最终字段,或仅包含文字的其他静态最终字段的值。事实上,如果你要反编译分配,你会看到:

    String s = "foo1000";   // No reference whatsoever to Const
    

    【讨论】:

    • 这适用于所有带有常量初始化器的final 变量,不需要static 字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 2012-05-09
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多