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图:
注:
以前遇到过这个小问题,当时也和同事讨论后解决了,没怎么关注这个问题,没想到今天又遇到了。
list遍历后,循环取值赋给对象,由于没有在循环内new对象,所以造成覆盖值得情况。
温故而知新,特以此谨记,下不再犯。