我是java的新手,所以請幫忙指導優化聲明java地圖的方法
情況1:如果在一個循環內部聲明一個java映射。情況2:如果在循環外部聲明一個Java映射。
Map<String, String> input = new HashMap<String, String>();
for (Document doc : docList) {
}
哪種情況是更優化(最佳實踐)的聲明方式,爲什麼?
AJ
我是java的新手,所以請幫忙指導優化聲明java地圖的方法
情況1:如果在一個循環內部聲明一個java映射。情況2:如果在循環外部聲明一個Java映射。
Map<String, String> input = new HashMap<String, String>();
for (Document doc : docList) {
}
哪種情況是更優化(最佳實踐)的聲明方式,爲什麼?
AJ
那麼它取決於您的使用 - 如果你需要新的Map
每次迭代然後循環else外面它初始化。
既然你在這兩個之間混淆 - 我相信你應該與案例2 - 因爲它只會初始化Map
只有一次,如果你在循環中初始化它,那麼Map
將無法訪問循環。
我也認爲如果你解釋你在做什麼Map
實例會更有幫助。
這取決於。取決於你想達到的目標。
for (Document doc : docList) {
Map input = new HashMap();
}
這對每次迭代都很有用,您需要有一個完全不同的值的新地圖。
Map input = new HashMap();
for (Document doc : docList) {
}
當您想將先前迭代的值用於下一次迭代時,這會很有用。
同樣在第二種情況下,即使在循環之後,地圖也可供您使用。首先,一旦循環結束,您將無法訪問地圖,
我想知道哪種情況會需要更多的內存?案例1,它會爲每次迭代創建一個新的地圖對象嗎?如果是,那麼當這些對象將被銷燬A.當循環移動到下一個條目或B。它將它保存在內存中並等待GC – VirtualLogic
這取決於您要存儲的元素的數量。但是,是的,在第一種情況下,對於每次迭代,jvm都必須創建一個新的HashMap引用,而第二個引用將具有相同的引用。 堆中的對象一旦超出範圍就不會被銷燬。他們被GC銷燬。他們的參考被立即刪除。 – Garbage
請訪問http://javaprepare.blogspot.com/2007/08/whats-differences-between-object-and.html以瞭解有關「對象」和「參考」之間差異的更多信息 – Garbage
當您在第二個循環中退出循環時,地圖超出範圍;除非將其分配給其他內容,否則它符合GC的條件。
如果你打算在其他地方使用它,你必須去#1。
其他人已經解釋過需要在循環中聲明它,如果每次迭代需要一個。這裏有一個例子:
List<Map> maps = new ArrayList<Map>();
for (int i = 0; i < 10; ++i) {
Map temp = new HashMap();
maps.add(temp);
}
其實在你的情況沒有優化點,因爲,兩者都不相同。您可能想知道哪一個更適合以下情況。
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>();
}
在這種情況下,第一個是小優化,因爲該聲明並將它們映射一次,但初始化它在文檔列表中的每個條目的。
第一種方法會招致實質性的客體流失(特別是如果您的收藏docList
很大)。 Java對象分配是一項相對昂貴的操作,並且該對象流失導致的垃圾收集開銷也會影響您的性能。
第二種方法將一遍又一遍地重複使用相同的地圖(只要確保在每次新的迭代之前不要忘記清空它)。
使用第二種方法在性能方面幾乎總是更好,但是第一種方法使得它在代碼中變得更清潔,您不希望在循環之外使用Map
(它具有更窄的範圍) ,我有時認爲這是一件好事。從本質上講,我的結論是:
Map
的可見性範圍,否則選項2,或者如果您真的擔心獲得最佳性能。如果我們每次迭代都有相同的密鑰情況1: 'String key1 =「key1」; String key2 =「key2」; (Document doc:docList) { \t Map
@ user1453247通過使用選項2可以獲得最佳性能,甚至可以在迭代之間跳過清理地圖。 – Romain
這些是非常不同的事情 - 考慮一下。 –