1. 程式人生 > >ArrayList.add後,前面資料被覆蓋的問題

ArrayList.add後,前面資料被覆蓋的問題

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?在CODE上檢視程式碼片派生到我的程式碼片
  1. for(String key : MainActivity.classroomMap.keySet()) {  
  2. contentListItems = new ArrayList< Map<String, Object> >();  
  3. contentListItems.clear();  
  4. ....  
  5. }  
for(String key : MainActivity.classroomMap.keySet()) {
contentListItems = new ArrayList< Map<String, Object> >();
contentListItems.clear();
....
}


問題很簡單,只是我自己太粗心了