1. 程式人生 > >List使用add方法時,生成的list是最後加入的資料的重複

List使用add方法時,生成的list是最後加入的資料的重複

  近來專案中用到list的add方法,執行報錯,新增重複項,debug以後發現生成的list中,都是最後一條資料的重複。後來發現只需要改一句就可以避免這個錯誤。

    MachineBean machineBean = new MachineBean();
    List list = this.machineManager.getMachine(machineBean);
    List<InfoBean> saveList = new ArrayList<InfoBean>();
    InfoBean infoBean = new InfoBean();
			if(list!=null&list.size()!=0){
				for (int i=0;i<list.size();i++) {
					 machineBean=(MachineBean) list.get(i);
					 infoBean.setId(machineBean.getId());
					 infoBean.setIsvalid("1");
					 infoBean.setCjr("1");
					 saveList.add(infoBean);
				}
			}

其實一開始new了一個InfoBean物件,就只是建立了一個唯一的ID,在將物件add進list時,list就只是添加了一個物件的引用,儘管set物件,改變了屬性,但是其ID還是唯一的,list又只是對於物件唯一ID的引用。所以結果就是重複添加了物件。

要避免這個錯誤,我們就把new物件放到迴圈中,每次迴圈都建立一個物件,這樣ID不唯一了。

		MachineBean machineBean = new MachineBean();
   		List list = this.machineManager.getMachine(machineBean);
		List< InfoBean> saveList = new ArrayList< InfoBean>();

			if(list!=null&list.size()!=0){
				for (int i=0;i<list.size();i++) {
					 InfoBean  InfoBean = new  InfoBean();

					 machineBean=(MachineBean) list.get(i);
					 InfoBean.setId(machineBean.getId());
					 InfoBean.setConfigkey(configkey);
					 InfoBean.setConfigvalue(configvalue);
					 InfoBean.setIsvalid("1");
					 InfoBean.setCjr(getSessionSysuser(request).getYhdh());
					 InfoBean.setCjsj(DateTools.getSysDate19());
					saveList.add( InfoBean);
				}
			}