2017-06-12 143 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