2017-06-12 68 views
3

假设我们有一个类Const.java含1000字符串常量: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个字符串,代码是否会以相同的速度运行?)

+0

在'Const.java'中声明1,000,000个字符串常量是不可能的。技术最高不超过33,000。但是对性能的影响恰好为零,[由VGR解释](https://stackoverflow.com/a/44504273/2711488);如果类“Const”只包含这些声明,它甚至不会在运行时加载。 – Holger

回答

2

访问时间将始终相同。

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

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

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

2

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

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

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

这适用于具有常量初始值设定项的所有'final'变量,没有要求成为'static'字段。 – Holger