Java 双重for循环性能

血的教训:尽量不要在循环内部对单条数据做处理,这会导致程序非常慢,如:

Java code

for (Map 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 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、

该方案在方案一的基础上,将循环变量的实例化放到循环外,这样可以进一步减少相关循环变量的实例化次数

原文地址:http://blog.csdn.net/dl020840504/article/details/19906843




你可能感兴趣的:(Java)