2013-12-13 46 views
0

我目前有一個巨大的方法返回一個給定的整數字符串。它使用switch聲明與686個案例,每個case返回string constant。有683個獨特的長度範圍從10到50個字符的字符串,全部用於該方法。我想知道這些字符串何時加載。他們是否在課堂上課時被加載?如果是這樣,是否有一種方法可以只在我第一次需要它們時加載這些字符串,並在沒有更多引用時得到垃圾回收?java - 在類加載時立即加載方法中的字符串嗎?

現在,我正在從包含一個字符串表的文件中加載這些字符串。他們將被放置在WeakHashMap中。有沒有更好的方法來做到這一點?

我想到的另一種方法是將每個字符串放在一個靜態字段中。這樣,它只會在我第一次獲取該字段的值時被加載。但那會讓我的包裹變大。

此外,dalvik-vm是否使用相同的字符串常量加載例程。

+2

2字節/字符* 50字符/字符串* 700字符串= 70 kB數據。我不會爲此擔心。 –

+1

你應該真的在使用關聯數組,而不是switch語句。我很討厭看到那個switch語句。然後你可以把關聯數組放在你想要的任何級別,並從你想要的地方提取你所需要的。 – Leifingson

+0

這有你的答案:http://stackoverflow.com/questions/4918399/what-type-of-memory-heap-or-stack-string-constant-pool-in-java-gets-stored –

回答

1

太陽提出了一個優化,很多新的Java程序員稱爲字符串池相當混亂。它允許字符串,這是最常用的對象之一,以優化自己並節省空間。重要的一點是,字符串池只適用於字符串文字,意味着它們的值被賦值,而不是使用String構造函數構造。

字符串池(有時也稱爲字符串規範化)是一個過程,用一個共享的String對象替換多個具有相同值但不同身份的String對象。您可以通過保留自己的地圖(可能根據您的要求使用軟或弱引用)並將地圖值用作規範化值來實現此目標。或者您可以使用由JDK提供給您的String.intern()方法。

如果您的程序根目錄中沒有對它們的引用,那麼JVM字符串池中的所有字符串都有資格進行垃圾回收。這意味着如果你的實例字符串超出了範圍,並且沒有其他引用 - 它將從JVM字符串池收集垃圾。

因此,您不必爲此煩惱,因爲JVM已經在內部執行此操作。

+0

對不起一月按下輸入錯誤 –

+0

也被稱爲字符串實習http://en.wikipedia.org/wiki/String_interning – Leifingson

+0

我知道java正在使用字符串池。我不知道的是,當它將這樣的字符串放在該池中時,即在類初始化的意義上,它將被加載或者只在需要時加載。 –