2017-07-27 93 views
-2

以下程序給出的輸出:4 4 4 4 4在Java之前聲明清單循環

package HelloWorld; 
import java.util.List; 
import com.google.common.collect.Lists; 
public class HelloWorld { 
     public static void main(String args[]) { 
       List<Product> productList = Lists.newArrayList(); 
       **Product product = new Product();** 
       for (int i = 0; i < 5; i++) {     
         product.setId("id:" + i); 
         productList.add(product); 
       } 
       // Printing values 
       for (int i = 0; i < productList.size(); i++) { 
         System.out.println(productList.get(i).getId());   
       } 
     } 
} 

這是因爲產品在循環外部聲明。 但看到另一個方案:

package HelloWorld; 
import java.util.List; 
import com.google.common.collect.Lists; 
public class HelloWorld { 
    public static void main(String args[]) { 
     **List<String> list = Lists.newArrayList();** 
     for(int i=0;i<5;i++){   
      list.add(""+i); 
     }  
     for (int i = 0; i < list.size(); i++) { 
      System.out.println(list.get(i));   
     } 
    } 
} 

這使輸出:0 1 2 3 4

可我知道爲什麼它打印0 1 2 3 4即使列表被宣告出局側的循環?我期望它來打印

+1

「我希望它打印4 4 4 4 4」=> **爲什麼?**您將獨立於其他人的每個值添加到列表中。 – Seelenvirtuose

+0

你爲什麼認爲它打印所有4個?您的預期輸出是完全錯誤的。 –

+3

在第一個示例中,您將添加5次相同的產品,在第二個示例中,您將添加5個不同的字符串。 –

回答

2

productfor循環外部定義,所以每次你在做product.setId("id:" + i);時間要覆蓋相同的實例的id,然後重新添加到列表中。創建product實例的循環

List<Product> productList = Lists.newArrayList(); 
for (int i = 0; i < 5; i++) { 
    Product product = new Product();    
    product.setId("id:" + i); 
    productList.add(product); 
} 
2

在你的第一個例子裏,你只有一個實例化對象Product和4次添加到列表中。但是,每次 - 在添加它之前,都會用當前值i覆蓋Id值。最終將變爲4.

在第二個示例中,您在循環的每次傳遞中都添加一個新的String對象,因此不會覆蓋已設置的值。