問題:
List<People> peopleList = new ArrayList();
People people = new People();
for(int i = 0 ; i < 10 ; i++){
people.setId("id" + i);
people.setAge("age" + i);
peopleList.add(people);
}
//輸出結果都是
//id10
//age10
sout(peopleList);
原因
問題的產生在於,對象。對象中保存的都是地址。
People 對象在循環前,便新建成功,分配了內存空間,不再發生變化。
每次賦值的過程,都是在同一個內存空間,更改保存的地址。
peopleList.add(people);
//其中,List 中保存的是,people 這個對象。
//在循環賦值的過程中,people 中的保存的值(所指向的地址)一直在發生變化。
for(int i = 0 ; i < 10 ; i++){
people.setId("id" + i);
people.setAge("age" + i);
}
所以最后存入 List 中的對象,都是最后輸入的屬性
正確的做法
List<People> peopleList = new ArrayList();
for(int i = 0 ; i < 10 ; i++){
//將對象的定義放在循環里,每次都是一個新的對象
People people = new People();
people.setId("id" + i);
people.setAge("age" + i);
peopleList.add(people);
}
sout(peopleList);
此時,每次循環都會新建一個對象,分配一個新的內存空間。