2015-06-22 74 views
0

我有這個循環運行大約1000000次。動態創建對象並將它們存儲爲字段

    while ((line = br.readLine()) != null) { 
         if(!(line.isEmpty())){ 

         data = new JSONObject(line); 
         name = (String)data.get("name"); 
         surname = (String)data.get("surname"); 
         ar.put(name, surname); //an array 

        } 
       } 

什麼是有它這樣的效率方面的優勢(如果有的話)的數據,姓名的領域相比,在運行時創建一個新的動態對象

    while ((line = br.readLine()) != null) { 
         if(!(line.isEmpty())){ 

         JSONObject data = new JSONObject(line); 
         String name = (String)data.get("name"); 
         String surname = (String)data.get("surname"); 
         ar.put(name, surname); //an array 

        } 
       } 

回答

4

有贏沒什麼區別,因爲你只是改變了變量的範圍。由於你沒有使用範圍之外的變量,因此生成的字節碼也將相同(可以用javap進行試用)。

所以使用第二種方式來清晰。

編輯:事實上,如果你有作爲類的字段的變量,字節碼可能會不同。性能將取決於JIT如何最終結束,但不太可能存在顯着差異(即使如此,第二種方法將更容易優化 - >可能更快)。

+0

甚至沒有在GC過程? – user5035902

+0

您正在創建相同數量的對象,因此GC不太可能受到影響。 – Kayaman

+1

什麼是GC在這裏打掃?你將它們存儲在一個數組中,所以仍然引用它們。但是,如果你沒有存儲它們,GC在兩個例子中都會以同樣的方式進行清理。 – vlatkozelka

0

第一種方法應該執行得更快,因爲它使用的每個變量(數據,名字,姓氏)的每一個循環的單一參考
雖然秒方法創建新的參考每個循環中的每一個。所以你最終創造了每個參考!

然而,創建一個參考是一個恆定的時間操作,不應該打擾你。你應該專注於讓你的代碼易讀和清潔。因此,由於最佳做法表明變量的範圍儘可能小,所以如果我知道這種方法會運行多次,我只會選擇第一種方法。 (我的意思是,你可以等待一些毫秒更長,如果它只是要運行一次)

性能提示:既然你是關心性能,並給予你大致知道迭代的次數,我建議你初始化容量Map

+0

引用不會在運行時創建。除了關於初始容量的部分,你的回答是完全錯誤的。 – Kayaman

相關問題