血的教训:尽量不要在循环内部对单条数据做处理,这会导致程序非常慢,如:
Java code
for (Map<String, Object> map : dataList2) {
String[] valArr = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
String fieldType = commonManager.searchForString(getFieldTypeSql, new Object[]{tableName,fields[i]});
if(TableUtil.TABLE_DATE_EN.equals(fieldType)){//如果是日期
if(StringUtils.isNotBlank((String) map.get(fields[i]))){
valArr[i] = DateTool.toDateString(DateTool.getDate((String) map.get(fields[i])),TableUtil.FORMAT_CREATE_DATE_1);
}
}else if(TableUtil.TABLE_PERCENTAGE_EN.equals(fieldType)){//如果是百分比
if(DataImportUtil.isValid(TableUtil.PATTERN_DECIMAL,(String) map.get(fields[i]))){//如果是数字
BigDecimal dec = new BigDecimal((String) map.get(fields[i]));
dec = dec.multiply(new BigDecimal(100));//小数*100
double f1 = dec.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();//保留两位小说
String rsnum = String.valueOf(f1);
if(DataImportUtil.isValid(TableUtil.PATTERN_INTEGER,rsnum) && rsnum.indexOf(".") > -1){//如果小数点后面全是0 只取整数
rsnum = rsnum.substring(0, rsnum.indexOf("."));
valArr[i] = rsnum + "%";
}else{
valArr[i] = rsnum + "%";
}
}else{
valArr[i] = "0%";
}
}else{
valArr[i] = (String) map.get(fields[i]);
}
}
sourcelist.add(valArr);
}
这段代码如果dataList2为1300,而 fields.length为11,则需要跑32分钟,我的电脑为而
Java code
for (Map<String, Object> map : dataList2) {
String[] valArr = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
valArr[i] = (String) map.get(fields[i]);
}
sourcelist.add(valArr);
去除for循环中对单条数据的处理后dataList2为1300,而 fields.length为11,只需6 微秒。
如果数据进一步增加,那前一种足一让人有想死的冲动。因此尽可能在进入循环前想方设法的处理好数据;
另一些嵌套for循环的优化技巧:
1、
将循环次数最少的放到外面,循环次数最多的放里面,这样可以最大程度的(注:3个不同次数的循环变量共有6种排列组合情况,此种组合为最优)减少相关循环变量的实例化次数、初始化次数、比较次数、自增次数
2、
该方案在方案一的基础上,将循环变量的实例化放到循环外,这样可以进一步减少相关循环变量的实例化次数