2011-02-16 116 views
0

例如 我需要在哪裏我的ArrayList應該在每個索引處包含hashmap,例如如何避免在java中循環中頻繁創建對象?

 
Public class Testing { 
    private ArrayList < < HashMap< String, String>> myData ; 
    public static void main(String[] args) { 
    myData = new ArrayList < HashMap < String, String>>(); 
    initialize(); 
    //After initialize myData should contain different Hashmaps. 
    } 
    public static void initialize() {  
    for (int i= 0; i < 10 ;i++) { 
     myMap = new HashMap(); //Bad because,creating Objects inside the loop. 
     myMap.put("title", "abc"+i); //Adding i, just to show that new values are stored everytime 
     myMap.put("name", "xyz"+i); 
     myData.add(myMap); 
    } 

    } 
} 

上面的代碼將創建哈希表對象的每一次循環中, 有什麼更好的方式來做到這一點,這樣我可以避開對象的創建每一次? 我在Android中使用此代碼,但我認爲這是更一般化,並與Java更多。

+1

你爲什麼要避免它?現代JVM非常擅長這一點。你有證據表明這是你的應用程序的問題嗎? – skaffman 2011-02-16 08:45:53

+1

好的,我在android,移動操作系統中使用這段代碼,這裏垃圾收集器不時地踢,所以必須避免創建對象以獲得性能和最佳內存使用。 – sat 2011-02-16 08:49:22

回答

5

如果您需要地圖列表,那麼您將不得不這樣做。 (實際上,你可以編寫一個幫助器方法,在第一次訪問時初始化映射,並且只通過該幫助器方法訪問映射,但我不會那麼推薦)。

但是,您可以重新考慮您的設計並使用不同的數據結構,也許可以關閉地圖/列表關係並使用Guava Multimap。這隻會在需要時初始化集合,並且可以保存初始化例程。

此外,地圖列表通常可以由自定義對象列表替換。根據鍵是否是動態的,自定義對象可能更有意義。

1

通常清晰度比性能更重要。在這個例子中,編譯它會是一個改進。 ;)

您沒有創建足夠的對象來真正重要,但減少其消耗的一種方法是使用POJO而不是HashMap。

0

我認爲這不好。

既然你想要一個ArrayList<<HashMap<String, String>>,沒有錯。即使沒有難聞的氣味:)