java中遍历集合时后,循环取值时,出现值被覆盖的情况

1.java面向对象之多new对象

在集合中循环赋值时舍不得new对象就会造成值被覆盖的情况,所以说对象就是用来new的。。。。。。

今天又一次遇到这个舍不得new对象的情况,debug了好久,苦恼无果,最后还是给蹦出来了,,,O(∩_∩)O哈哈~

下面附上代码:

package com.yinxin.control;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.yinxin.entity.DfgzPkgMx;
import com.yinxin.tools.Log4jBean;

public class Test {
	public void readFileContents(String LocalFilePath, int RecvPkgNo) {
		Log4jBean.logger.info("进入readFileContents这个方法");
		try {
			// read file content from file
			File file = new File(LocalFilePath);
			Log4jBean.logger.info("读取文件的路径为[" + LocalFilePath + "]");
			// BufferedReader br = new BufferedReader(new FileReader(file));
			BufferedReader br = new BufferedReader(new InputStreamReader(
					new FileInputStream(file), "gbk"));
			String str = null;
			SimpleDateFormat formatter = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:SS");
			String nowTime = formatter.format(new Date());
			Log4jBean.logger.info("需要拼接的系统时间为[" + nowTime + "]");
			StringBuffer sb = new StringBuffer();
			while ((str = br.readLine()) != null) {
				sb.append(str + "\r\n");
			}
			Log4jBean.logger.info("文件内容为:\n" + sb);
			List<DfgzPkgMx> list = new ArrayList<DfgzPkgMx>();
			// 读取文件内容,进行内容分割后
			Log4jBean.logger.info("开始进行按行[$]进行切割文件");
			String[] splitFileContents = sb.toString().split("\\$");
			for (int i = 0; i < splitFileContents.length - 1; i++) {
				DfgzPkgMx mx = new DfgzPkgMx(); // 每循环一次就会开个空间
				StringBuffer stringBuffer = new StringBuffer();
				// stringBuffer.append(nowTime + "&"); // 拼接入库时间
				// stringBuffer.append(RecvPkgNo + "&"); // 通知包号
				// splitFileContents[i] = stringBuffer.toString()+
				// splitFileContents[i]; // 重新赋值
				String[] ss = splitFileContents[i].split("\\&"); // 将文件每行用&进行切割
				// mx.setInTime(ss[0]);
				mx.setRecvPkgNo(RecvPkgNo);
				mx.setCode(ss[0]);
				mx.setContractorCorpCode(ss[1]);
				mx.setContractorCorpName(ss[2]);
				mx.setPayBankCode(ss[3]);
				mx.setPayBankName(ss[4]);
				mx.setPayBankCardNumber(ss[5]);
				mx.setPayFlag(ss[6]);
				mx.setWorkerName(ss[7]);
				mx.setIDCardType(ss[8]);
				mx.setIDCardNumber(ss[9]);
				mx.setPayRollBankCardNumber(ss[10]);
				mx.setPayRollBankName(ss[11]);
				mx.setPayRollTopBankName(ss[12]);
				mx.setBankLinkNumber(ss[13]);
				mx.setPayRollTopBankCode(ss[14]);
				mx.setTotalPayAmount(Integer.parseInt(ss[15]));
				mx.setBalanceDate(ss[16]);
				mx.setPlatFlowNo(ss[17]);
				mx.setSysNo(ss[18]);
				mx.setPayRollCode(ss[19]);
				list.add(mx);
			}
			Log4jBean.logger.info("取出拼接的第一条数据" + splitFileContents[0]);
			// 遍历list集合,逐条入库
			int count = 0; // 入库记录数
			for (int j = 0; j < list.size(); j++) {
				Log4jBean.logger.info("取出集合中对象中的值来逐条进行入库!");
				DfgzPkgMx mx1 = new DfgzPkgMx();
				mx1 = list.get(j);
				// 逐条插入DFGZ_pkgmx工资包明细信息表中,其中“通知包号”字段值为DFGZ_package的通知包号
				int temp = insertSplitFileContents(mx1);
				if (temp == 0) {
					Log4jBean.logger.info("数据已经写入成功,正准备更新状态!!!!");
					count++; // 统计实际成功入库记录数
					updatePkgState(mx1.getRecvPkgNo(), count);
				} else {
					// 插入失败时,置失败标志
					Log4jBean.logger.error("数据写入失败,置失败标志[99]!");
					updateInsertFailCWXX(RecvPkgNo);
				}

			}

			br.close(); // 关闭字符流
		} catch (FileNotFoundException e) {
			Log4jBean.logger.error("读取文件异常,异常信息为[" + e.getMessage() + "]");
		} catch (IOException e) {
			Log4jBean.logger.error("IO异常,异常信息为[" + e.getMessage() + "]");
		}
	}

}

附上debug图:

java中遍历集合时后,循环取值时,出现值被覆盖的情况

注:

以前遇到过这个小问题,当时也和同事讨论后解决了,没怎么关注这个问题,没想到今天又遇到了。

list遍历后,循环取值赋给对象,由于没有在循环内new对象,所以造成覆盖值得情况。

温故而知新,特以此谨记,下不再犯。