ArrayList.add後,前面資料被覆蓋的問題
阿新 • • 發佈:2019-02-11
1. 程式碼示例:
public class ListTest {
publicstaticvoidmain(String[] args){
// TODO Auto-generated method stub
List<User> list =new ArrayList<User>();
User user=new User();
user.setName("jack");
user.setPassword("111");
list.add(user);
user.setName("JAY" );
user.setPassword("222");
list.add(user);
User user1=new User();
user1.setName("jim");
user1.setPassword("333");
list.add(user1);
for(Iterator<User> i = list.iterator();i.hasNext(); ){
User str = (User) i.next();
System.out.println(str.getName()+" " +str.getPassword());
}
}
}
User類:
public class User {
private String name;
private String password;
public String getName(){
return name;
}
publicvoidsetName(String name){
this.name = name;
}
public String getPassword(){
return password;
}
publicvoidsetPassword(String password) {
this.password = password;
}
}
2. 控制檯列印資訊:
JAY 222
JAY 222
jim 333
3. 解析:add加進去的是物件的一個引用,使用同一個物件時,每次都更新了這個引用的值,所以list裡面的值都一樣的。如果使用for等迴圈時,注意把User user=new User()放到迴圈裡面,每次都生成一個新的物件,更改自身不會對其他元素有影響。
當然,問題的原因也很簡單:
在我迴圈新增資料的時候,我只聲明瞭一次contentListItems,也就是隻有一個contentListItems這個List,這樣我每次寫入Map資料的List都是同一個List,所以當我把這個List新增進classroomListItems時,新增的本質是contentListItems的地址,所以每次都是同一個contentListItems,這樣後面的資料就覆蓋了前面的資料。
解決方法就是每次都生成一個List:
[java] view plain copy print?- for(String key : MainActivity.classroomMap.keySet()) {
- contentListItems = new ArrayList< Map<String, Object> >();
- contentListItems.clear();
- ....
- }
for(String key : MainActivity.classroomMap.keySet()) {
contentListItems = new ArrayList< Map<String, Object> >();
contentListItems.clear();
....
}
問題很簡單,只是我自己太粗心了