2012-06-13 54 views
0

我是java的新手,所以請幫忙指導優化聲明java地圖的方法

情況1:如果在一個循環內部聲明一個java映射。情況2:如果在循環外部聲明一個Java映射。

Map<String, String> input = new HashMap<String, String>(); 
for (Document doc : docList) { 

} 

哪種情況是更優化(最佳實踐)的聲明方式,爲什麼?

AJ

+3

這些是非常不同的事情 - 考慮一下。 –

回答

4

那麼它取決於您的使用 - 如果你需要新的Map每次迭代然後循環else外面它初始化。
既然你在這兩個之間混淆 - 我相信你應該與案例2 - 因爲它只會初始化Map只有一次,如果你在循環中初始化它,那麼Map將無法​​訪問循環。
我也認爲如果你解釋你在做什麼Map實例會更有幫助。

3

這取決於。取決於你想達到的目標。

for (Document doc : docList) { 
    Map input = new HashMap(); 
} 

這對每次迭代都很有用,您需要有一個完全不同的值的新地圖。

Map input = new HashMap(); 
for (Document doc : docList) { 

} 

當您想將先前迭代的值用於下一次迭代時,這會很有用。

同樣在第二種情況下,即使在循環之後,地圖也可供您使用。首先,一旦循環結束,您將無法訪問地圖,

+0

我想知道哪種情況會需要更多的內存?案例1,它會爲每次迭代創建一個新的地圖對象嗎?如果是,那麼當這些對象將被銷燬A.當循環移動到下一個條目或B。它將它保存在內存中並等待GC – VirtualLogic

+0

這取決於您要存儲的元素的數量。但是,是的,在第一種情況下,對於每次迭代,jvm都必須創建一個新的HashMap引用,而第二個引用將具有相同的引用。 堆中的對象一旦超出範圍就不會被銷燬。他們被GC銷燬。他們的參考被立即刪除。 – Garbage

+0

請訪問http://javaprepare.blogspot.com/2007/08/whats-differences-between-object-and.html以瞭解有關「對象」和「參考」之間差異的更多信息 – Garbage

0

當您在第二個循環中退出循環時,地圖超出範圍;除非將其分配給其他內容,否則它符合GC的條件。

如果你打算在其他地方使用它,你必須去#1。

其他人已經解釋過需要在循環中聲明它,如果每次迭代需要一個。這裏有一個例子:

List<Map> maps = new ArrayList<Map>(); 
for (int i = 0; i < 10; ++i) { 
    Map temp = new HashMap(); 
    maps.add(temp); 
} 
0

其實在你的情況沒有優化點,因爲,兩者都不相同。您可能想知道哪一個更適合以下情況。

Map<String, String> input = null; 
for (Document doc : docList) { 
    input = new HashMap<String, String>(); 
} 

OR

for (Document doc : docList) { 
    Map<String, String> input = new HashMap<String, String>(); 
} 

在這種情況下,第一個是小優化,因爲該聲明並將它們映射一次,但初始化它在文檔列表中的每個條目的。

0

第一種方法會招致實質性的客體流失(特別是如果您的收藏docList很大)。 Java對象分配是一項相對昂貴的操作,並且該對象流失導致的垃圾收集開銷也會影響您的性能。

第二種方法將一遍又一遍地重複使用相同的地圖(只要確保在每次新的迭代之前不要忘記清空它)。

使用第二種方法在性能方面幾乎總是更好,但是第一種方法使得它在代碼中變得更清潔,您不希望在循環之外使用Map(它具有更窄的範圍) ,我有時認爲這是一件好事。從本質上講,我的結論是:

  1. 如果您的文檔集可能會很大,使用選項2
  2. 如果您的文檔集,保證是小,使用選項1,如果你想你的代碼是非常明確說明Map的可見性範圍,否則選項2,或者如果您真的擔心獲得最佳性能。
+0

如果我們每次迭代都有相同的密鑰情況1: 'String key1 =「key1」; String key2 =「key2」; (Document doc:docList) { \t Map input = new HashMap (); \t input.put(key1,「value1」); \t input.put(key2,「value2」); \t dosomthing(); }' 案例2: 'String key1 =「key1」; String key2 =「key2」; Map input = new HashMap (); (document doc:docList) { \t input.put(key1,「value1」); \t input.put(key2,「value2」); \t dosomthing(); }' – VirtualLogic

+0

@ user1453247通過使用選項2可以獲得最佳性能,甚至可以在迭代之間跳過清理地圖。 – Romain