java对变量的访问时间
假设我们有一个包含1000个字符串常量的类java对变量的访问时间,java,compiler-optimization,Java,Compiler Optimization,假设我们有一个包含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.ja
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
中有1000000个字符串,那么代码会以相同的速度运行吗?访问时间将始终相同
当应用程序启动时,使用类加载器将类加载到RAM内存中。常量(static/final)存储在一个内存位置,无论在哪里使用,在编译时都会在代码中被替换
您应该注意的唯一区别是在应用程序的开始时间,这将与您在类中拥有的变量数量成比例
访问内存位置总是O(1),就像从HashMap检索对象一样。是的,它将以相同的速度运行。一个重要原因是这些常量都是在编译时解析的,而不是在运行时解析的 编译代码时,将分析仅由文字组成的任何静态最终字段,或仅由文字组成的其他静态最终字段的值。事实上,如果要反编译该分配,您将看到:
String s = "foo1000"; // No reference whatsoever to Const
这适用于所有带有常量初始值设定项的
final
变量,不需要静态
字段。不可能在Const.java
中声明1000000个字符串常量。技术最大值小于33000。但对性能的影响完全为零,正如;如果类Const
仅包含这些声明,则它甚至不会在运行时加载。