日期:2014-05-20  浏览次数:20671 次

为什么这段代码会输出10个17?我觉得每次list都添加进去了啊?怎么最后都被替换了?

import java.util.ArrayList;
import java.util.List;

public class Test {
List<First> first ;

public List<First> getFirst() {
return first;
}
public void setFirst(List<First> first) {
this.first = first;
}
public static void main(String[] args) {
Test  test = new Test();
int i = 10 , j = 8 ;
First f = new First();
List<First> list = new ArrayList<First>();
while (i>0){
f.setK(j++);
f.setI("==");
list.add(f);
i--; 
}
test.setFirst(list);
for(First first : list){
System.out.println(first.getK());
}
}
}

class First {
private String i ;
private int k ;
public String getI() {
return i;
}
public void setI(String i) {
this.i = i;
}
public int getK() {[code=java]

return k;
}
public void setK(int k) {
this.k = k;
}
}[/code]


import java.util.ArrayList;
import java.util.List;

public class Test {
List<First> first ;

public List<First> getFirst() {
return first;
}
public void setFirst(List<First> first) {
this.first = first;
}
public static void main(String[] args) {
Test  test = new Test();
int i = 10 , j = 8 ;
First f ;
List<First> list = new ArrayList<First>();
while (i>0){
                        f = new First();
f.setK(j++);
f.setI("==");
list.add(f);
i--; 
}
test.setFirst(list);
for(First first : list){
System.out.println(first.getK());
}
}
}

class First {
private String i ;
private int k ;
public String getI() {
return i;
}
public void setI(String i) {
this.i = i;
}
public int getK() {
return k;
}
public void setK(int k) {
this.k = k;
}
}
这样是没有问题的。

------解决方案--------------------
因为你加到list中的First对象都是同一个,每次修改也都是对同一个对象进行修改,所以最后结果都是17。刚才在论坛里还碰到一个类似的问题。
------解决方案--------------------
第一种写法,只有一个First实例,list里存了10个这个实例的副本,当然是同一个值(为什么都是17呢?那是因为你最后一次更新的值是17,由于是同一个实例,所以每一次都把之前的给覆盖了)。

第二种些法,每一次循环都new一个First实例,list里存了10个不同的First实例,所以是不一样的结果。
------解决方案--------------------
改为

        List<First> list = new ArrayList<First>();
        while (i>0){