关于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中对象覆盖了前面添加的对象假象~~~,事实上他们压根就是一个对象~~~

 

 

 

转载自 http://www.cnblogs.com/knight-ranqi/

转载于:https://www.cnblogs.com/hsxm/p/3586816.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值