有如下代码:
Customer customer = new Customer();
ArrayList ar = new ArrayList();
try {
getConnection();
stat_ = conn_.createStatement();
rs_ = stat_.executeQuery(sql); while (rs_.next()) {
customer.setCu_id(rs_.getInt("cu_id"));
customer.setCu_name(rs_.getString("cu_name"));
customer.setCu_password(rs_.getString("cu_password"));
ar.add(customer);
customer = new Customer();

}
} catch (Exception e) {
//Logger.error(e);
throw e;
} finally {
close(); }我发现,在ar.add(customer)的时候,ArrayList只是把customer的地址传给了ar[X]。
这样的后果是,本来我想用while循环读出结果存入ArrayList中,但由于每次循环都要对customer赋值(而在ArrayList中存储的只是指向某个customer对象的一个地址),导致前面的customer数据都被覆盖了感觉不应该这样的,请各位指教阿

解决方案 »

  1.   

    我的解决方法是在ar.add(customer);后加入
    customer = new Customer();各位说说看,这样好吗?
      

  2.   

    getConnection();
    stat_ = conn_.createStatement();
    List ar = new ArrayList();
    for (ResultSet rs_ = stat_.executeQuery(sql); rs_.next();) {
        Customer customer = new Customer();
        customer.setCu_id(rs_.getInt("cu_id"));
        customer.setCu_name(rs_.getString("cu_name"));
        customer.setCu_password(rs_.getString("cu_password"));
        ar.add(customer);}
      

  3.   

    java里除了基本类型(int,long,short,double,float,boolean,char,byte)之外的类型都是存的对象的引用。但是你的while里有
    customer = new Customer();
    应该不会覆盖之间的数据。
      

  4.   

    Ryo_Hazuki(困了):
    你所说的List是其他一个类还是手误?除此之外,似乎你的版本跟我的未修改过的版本基本一致 famousboy(famousboy) :
    我的while里有customer = new Customer(), 是我后来修改后加上去的,我最开始贴的程序是改好的。原来没有这么一句话。
    但是我有点怀疑:经过customer = new Customer(),customer发生了什么呢?是不是重新得到了一个空间? 如果是这样的话,那ArrayList指向的旧空间怎么办?如果没有被释放的话,不久内存泄露了?如果被释放了,ArrayList 起先存放的内容不就失效了?(事实上,我发现空间并未被释放)
      

  5.   

    Ryo_Hazuki(困了)的做法是对的,同意!
      

  6.   

    这是里氏代换原则的体现,能写子类的地方,一定可以写父类
    ArrayList 是继承List接口的,当然可以这么写,
    而且这么写符合依赖倒转原则,更加灵活
    接口编程是java编程的中心思想
      

  7.   

    dr2tr(deadsea):customer = new Customer(),是重新得到了一个空间。同时customer指向了这个新的空间,原来的空间还在内存中,并不会消失,所以你再修改customer也不会影响到旧的空间。通过之前的ar.add(customer),ar[X]已经指向了旧的空间,因此仍然你可以通过ar.get(i)访问旧的空间。
    当没有任何引用指向某块空间时,比如执行 ar = null;JVM在一段时间之后就会回收这些空间,这时你之前创建的所有customer对象才会从内存中消失。
      

  8.   

    谢谢回复
    我所不明白的是,ArrayList真的“存储的只是指向某个customer对象的一个地址”?那样的话,似乎有时候对ArrayList和Vection的讨论很多都没有意义了