以下程序提供输出: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
答案 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
对象,因此不会覆盖已设置的值。