2017-05-15 42 views
1

我在我的應用程序中有一個場景,pojo declaraion forloop

我必須將20個POJO對象添加到ArrayList中。在那種情況下,我有一個像下面這樣的方法。

public void methodname() { 

ArrayList arr = new ArrayList();  
    for(int i=0;i<20;i++) { 
    User userobj = new User(); 
    userobj.setName("xxx"); 
    userobj.setFirstName("xxx"); 
    userobj.setLastName("yyy"); 
arr.add(userobj); 
    } // end of for loop 

    } 

的一個朋友建議到外改變UserObj聲明循環。

public void methodname() { 
    User userobj = new User(); 
ArrayList arr = new ArrayList();  
    for(int i=0;i<20;i++) { 
    userobj.setName("xxx"); 
    userobj.setFirstName("xxx"); 
    userobj.setLastName("yyy"); 
arr.add(userobj); 
    } // end of for loop 

    } 
在第一種方法

,我創建了userobj裏面的for循環,所以,當下次迭代談到以前userobj將有資格獲得的垃圾收集器..

我想知道是否有任何顯著的性能將改進第二種方法?

+0

*「一位朋友建議」*這不是你的朋友,因爲她強迫你錯誤的代碼。 –

回答

1

我想知道是否有任何顯著的性能將提高對第二種方法?

您是否體驗區別?

編程時,你應該專注於正確性和代碼的可讀性

甚至不想想性能,除非你有一個實際的性能問題,你必須通過剖析某一個結構是原因證明。

最終普遍表現技巧是:

做一些事情的捷徑是沒有這樣做。

所以重點放在避免不必要的/隱藏的循環,而不是語法的變種,可以提高性能良好的算法。

+1

雖然絕對正確,但沒有直接回答這個問題。你沒有解釋兩種方式之間的差異,以及它們甚至不相互關聯。 –

+0

@Shashwat我認爲我回答了OP中唯一的問題... –

0

它需要在循環內部,否則你只能添加相同的用戶20次!

0

在第二種方法,你將有隻有一個列表

1

兩種方式,會產生不同的結果,最後一個對象。

中的第一個,創建20個單獨的對象,並將它們添加到列表中。因此,其中之一的變化,不會影響其他人

第二,然而,具有同一對象。因此,上的更改將反映其他人。其實,到了最後,所有對象的屬性是相同,即,等於最後添加的對象

性能明智的,你不能說。對象只有符合垃圾回收的條件時,沒有指向它們的引用。但是,由於兩種方式執行不同的功能,因此無法對它們進行比較。

唉,你的朋友是錯的。第一種方式就是你要找的東西。

1

第一種方法和第二種方法的主要區別在於,在第一種情況下,您在內存中創建了20個不同的User,它們被分配給該數組。

在第二種情況下,您只在內存中創建一個User,但將其屬性更改爲20次,並將相同的User分配給陣列的所有20個位置。

無論第一種情況或第二種情況如何,只有在陣列本身有資格進行垃圾回收時,您創建的User實例纔有資格進行垃圾回收,期望您可以移除與陣列的關聯。

如果沒有其他實例引用垃圾收集,垃圾收集只發生在一個實例上。

0

我認爲,正確的做法是: - 聲明外 - 實例裏面

public void methodname() { 
    ArrayList arr = new ArrayList(); 
    User userobj; 
    for(int i=0;i<20;i++) { 
    userobj = new User(); 
    userobj.setName("xxx"); 
    userobj.setFirstName("xxx"); 
    userobj.setLastName("yyy"); 
    arr.add(userobj); 
    } // end of for loop 

}