在java中循环之前声明List

时间:2017-07-27 11:12:08

标签: java list for-loop

以下程序提供输出:4 4 4 4 4

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());         
                }
        }
}

这是因为Product在循环外声明。 但是看另一个程序:

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即使列表在for循环中声明了吗?我预计它会打印 4 4 4 4 4

2 个答案:

答案 0 :(得分:2)

product是在for循环之外定义的,因此每次执行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);
}

答案 1 :(得分:2)

在第一个示例中,您只实例化一个Product对象并将其添加到列表中4次。但是,每次 - 在添加之前,都会使用当前值i覆盖Id值。最终将成为4.

在第二个示例中,您在循环的每次传递中添加一个新的String对象,因此不会覆盖已设置的值。