2009-05-27 92 views
0
List list = new ArrayList(); 


String[] test = {"ram", "mohan", "anil", "mukesh", "mittal"}; 

for(int i =0; i < test.length; i++) 

{ 

    A a = new A(); 

    a.setName(test[i]); 

    list.add(a); 

} 

JVM如何在每個循環中處理對象a的創建?如何「列表」不同實例之間的不同?在每次迭代中創建對象是不錯的做法。如果不是,將對象添加到列表中的最佳解決方案是什麼。jvm如何在循環內處理創建對象

+0

會發生一點編譯錯誤:無法實例化類型列表。 – guerda 2009-05-27 08:02:30

回答

6

在您的示例中,在循環的每次迭代中創建一個新對象。這份名單是能夠區分它們,因爲它不關心你叫他們所有的「一」,在你的代碼,它會跟蹤它們的通過得到每一次重新分配的參考,你叫

a = new A(); 

每一次調用一行代碼,在堆上創建一個新對象,並將它在內存中的地址分配給引用a。這就是該列表保留記錄的引用,而不是變量名稱。

這是填充列表的完美正常方式(除了其他人提到的語法錯誤,我假設您可以在嘗試編譯代碼時修復這些錯誤)。

2

List保存對創建的每個實例的引用。在循環內部創建每個對象都很好(我假設你的意思不是在循環之外聲明'a'變量,然後在每次迭代中重新賦值)。

+0

是的。你是對的。我的一位朋友告訴我,創建這麼多實例並不是一個好習慣。它會降低應用程序的性能。 – Shashi 2009-05-27 02:49:52

1

在每次迭代中創建一個新對象是不是很好的做法? 我的一個朋友告訴我,創建這麼多實例並不是一個好習慣。

如果您需要不同的個別實例,則需要創建它們。 由於您的列表需要五個名稱各不相同的對象(r​​am,mohan,anil等),因此您需要爲該循環的每次迭代創建一個新對象。你還有什麼要存儲這五個名字?

至於在循環之外聲明變量a,我認爲這不會在性能方面產生影響,並且還會降低易讀性。

A a; // dont do this 
for(int i =0; i < test.length; i++){ 
    a = new A(); 
    a.setName(test[i]); 
    list.add(a); 
} 

你可能會感興趣的for-each循環

for(String name: test){ 
    A a = new A(); 
    a.setName(name); 
    list.add(a); 
} 
1

如果我的JVM的理解是正確的,張貼的代碼將具有比

for (String name : test) 
{ 
    list.add(new A(name)); 
} 

沒有性能上的差異(當然,假設構造函數A(String s)是創建具有特定名稱的新實例的另一種方式)