zoukankan      html  css  js  c++  java
  • 关于ArrayList中添加对象的一个有趣问题~~~~

    今天学习struts中遇到了一个有趣的问题。

    问题大致如下:

      声明一个value object的arrayList对象,然后从数据库中读取想添加到该list对象中,结果后来添加的对象覆盖前卖添加的对象。起初代码如下(后来写的测试代码):

     1 public class Te {
     2     @Test
     3     public void test() {
     4         Person person = new Person();
     5         ArrayList<Person> persons =new ArrayList<Te.Person>();
     6         int i=2;
     7         while(i!=0){
     8 //            if(!persons.isEmpty())
     9 //            System.out.println(persons.get(persons.size()-1).getDescripton());
    10             i--;
    11           
      person.setDescripton(i+"princess");
    12             person.setName(i+"knight");
    13             System.out.println(person.getDescripton());
    14             persons.add(person);
    15         }
    16         System.out.println(persons.get(0).getDescripton());
    17         System.out.println(persons.get(1).getDescripton());
    18     }
    19     class Person{
    20         private String name;
    21         public String getName() {
    22             return name;
    23         }
    24         public void setName(String name) {
    25             this.name = name;
    26         }
    27         public String getDescripton() {
    28             return descripton;
    29         }
    30         public void setDescripton(String descripton) {
    31             this.descripton = descripton;
    32         }
    33         private String descripton;
    34     }
    35 }

    在while外面声明一个Person对象person的目的是为了减少内存开销,但是这样做的结果就是list中存储的对象都是用一个,最开始百思不得其解,于是加了激发昂注释代码,也就是文中注释掉的那两行,得到的结果如下图:

                                              

      仔细思考便找到了问题的所在,因为while循环外面声明的person变量,在每一次循环后在list中都add了这个对象,也就是说list中每一个元素都指向了同一个对象,然而每一个次循环都在改变这个对象的私有属性值,所以就造成了后面添加到list中对象覆盖了前面添加的对象假象~~~,事实上他们压根就是一个对象~~~

  • 相关阅读:
    安装CentOS7
    gitlab的CI/CD实现
    如何实现7*24小时灵活发布?阿里技术团队这么做
    架构整洁之道, 看这一篇就够了!
    什么是数据湖?有什么用?
    2020 云原生 7 大趋势预测
    饿了么交易系统 5 年演化史
    ajax 传参数 数组 会加上中括号
    文件下载
    数组常用方法
  • 原文地址:https://www.cnblogs.com/knight-ranqi/p/3535134.html
Copyright © 2011-2022 走看看