import java.util.ArrayList;
import java.util.List;public class TestA {
public static void main(String[] args) {
new TestA().abc();
new TestA().abcd();
} public void abc(){
List<TestB> list=new ArrayList();
TestB testB=null;
int i=2;
while(i-->0){
testB=new TestB();
testB.setA("hello,"+i);
list.add(testB);
}
for (TestB testB2 : list) {
System.out.println(testB2.getA());
}
}

public void abcd(){
List<TestB> list=new ArrayList();
TestB testB=new TestB();
int i=2;
while(i-->0){
testB.setA("hello,"+i);
list.add(testB);
}
for (TestB testB2 : list) {
System.out.println(testB2.getA());
}
}
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
import java.util.List;public class TestB{
String a="";
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
}各位帮忙看一下,为什么运行结果是
hello,1
hello,0
hello,0
hello,0我觉得应该是
hello,1
hello,0
hello,1
hello,0

解决方案 »

  1.   

    又是这个问题,请看:对于String的认识
      

  2.   

    但是这里是因为 new TestB 的位置不同,产生的不同结果,你确定是这个原因吗?我仔细看看
      

  3.   

    而且我在做j2ee编程的时候,这2种写法得到的结果是一样的;在做j2se编程的时候就出现了不同
      

  4.   

    不好意思 我大意了 没仔细看你的程序
    问题就出现在你申明new TestB的位置 请看注释:
    public void abc(){ 
    List<TestB> list = new ArrayList<TestB>(); 

    TestB testB = null;

    int i=2; 
    while(i-- > 0){ 
    testB = new TestB(); //每循环一次 重新申明一个新的TestB对象
    testB.setA("hello,"+ i); 
    list.add(testB); 


    for (TestB testB2 : list) { 
    System.out.println(testB2.getA()); 

    } public void abcd(){ 
    List<TestB> list = new ArrayList<TestB>(); 

    TestB testB = new TestB(); //从头到位,只有这一个testB实例,因此以最后一次的setA方法为准 所以输出了0,而不是1

    int i=2; 
    while(i-- > 0){ 
    testB.setA("hello,"+ i); 
    list.add(testB); 


    for (TestB testB2 : list) 
    System.out.println(testB2.getA()); 
      

  5.   

    是的,我也认为问题出现在new testB的位置不同上
    但是在方法abcd()里面
    while(i-- > 0){ 
                testB.setA("hello,"+ i); 
                list.add(testB); 

    我每次都用testB的set()方法给a重新赋值了啊,再添加到list里面,是在每次循环的时候做的操作,而不是循环结束以后操作的,为什么每次加进去的会一样呢?
      

  6.   

    这么说吧,testB对应于内存中的一块区域,里面有一个字符串型的属性。当第一次while循环时,testB的字符串属性被置为hello,1;然后你把testB加入到list中;第二次循环,testB的属性被置为hello,0,同时testB又被加入到list中。但是有一点,你需要注意,第二次循环改变的这个testB也就是前面一次循环中的testB。也就是说list里的第一个元素和第二个元素是相同的,两者是共享同一个对象,且属性都是hello,0。不知道你懂了没?画个图就很清楚了。
      

  7.   

    难道在存进去的都是实例testB的地址?那为什么在j2ee的web编程里面,这2种写法结果一样?
      

  8.   

    对啊 就是地址应该都一样啊 除非你把第一次循环的testB对象拷贝到另一个TestB型的对象中去 这样就能保存之前的testB对象
      

  9.   

    我也想到存的是地址的原因,但是困惑我的就是在j2ee的web编程里面,我用这样2种写法,结果不受影响,结果全部如abc()方法一样.这个不知道怎么解释
      

  10.   

    public List findClassAll() {
    String sql="SELECT * FROM u_class";
    Connection conn = (Connection) getSession().connection();
    PreparedStatement ps=null;
    List list=new ArrayList();
    UClass uClass=new UClass();
    try {
    conn.setAutoCommit(false);
    ps =conn.prepareStatement(sql);
    ResultSet rs = ps.executeQuery();
    while(rs.next()){
    int id=rs.getInt("id");
    String title=rs.getString("title");
    uClass.setId(id);
    uClass.setTitle(title);
    list.add(uClass);
    }
    conn.commit();
    }catch (Exception e) {
    e.printStackTrace();
    }finally{
    try {
    ps.close();
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    return list;
    }
    这是其中的一个方法,UClass 就相当于TestB
    运行的时候就没有出现这种问题
      

  11.   

    UClass uClass=new UClass(); 
    .
    .
    .
    while(rs.next()){ 
    int id=rs.getInt("id"); 
    String title=rs.getString("title"); 
    uClass.setId(id); 
    uClass.setTitle(title); 
    list.add(uClass); 

    这里