Java List 遍历超慢的问题分析以及解决

场景:今天客户打电话过来反应导出非常慢,慢到无法忍受。因为开发人员已经离职,所以只能自己动手了。

需求:主要是2个数据表关联问题,第一个表数据6万,其实每一条数据又需要根据流水号读取另外一个表。

出错原因:开发人员一次性读取主表6万数据,然后一次性读取附表所有内容放入List类型的listA中。关联的时候使用For循环进行遍历,主表6万记录,附表10万记录。总体遍历为6*10(万次),能不慢吗?

处理做法:第一次6万循环估计无法避免,暂时不理。第二次For遍历很明显绝对慢,其实很简单。可以使用Map进行遍历查值,非常快!

//第一步:把List的值写入Map结构中
List<ServiceAppendix> sas = serviceAppendixManager.findAll();  //取出来,暂时放到了内存了
Map<String, ServiceAppendix> mapSas = new HashMap<String, ServiceAppendix>();
for (ServiceAppendix sa : sas) {
     if (sa == null) {
	continue;
     }
     // ServiceAppendix为javabean对象.
     // 以流水号作为key.
     mapSas.put(sa.getSerialNum(), sa);
}
//第二步:根据键值查找对象
ServiceAppendix temp = mapSas.get(sd.getSerialNum());//sd为对象,getSerialNum()为获取流水号

备注:开发人员之前附表没遍历一次查询一次数据库,即6万次查询,也是非常慢的,不建议使用。真要用,建议加索引。

猜你喜欢

转载自samter.iteye.com/blog/2229219