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