集合遍历中的算法思想
程序员文章站
2022-05-29 09:21:35
...
集合是我们日常开发中常用的数据存储结构,遍历集合元素也是我们日常开发中所少不了的。
最近笔者在工作中用到的一个开发项目,对10万条数据的集合便利做数据解析。处理流程如下:
每次导出数据大致在100万条左右,分成十个左右的集合,并发的去导出,整个流程下来耗时80s左右。
速率的优化已经迫在眉睫。
通过在代码中增加日志观察各个流程的时间节点,却发现耗时最严重的是只有一个for循环的业务处理。耗时40s。
代码示例1
for(int i=0;i< models.size();i++){
Model model = models.get(i);
// .....
}
由于业务代码中需要用到下标,故用了这种方式遍历。相信有经验的道友已经发现了这段代码的问题。
代码示例2
int i = 0;
for(Model model : models){
// .....
i++;
}
这是笔者优化后的代码,耗时1s不到。不知道友们是否观察出区别?
这里重点在于集合元素的获取方式,第一种方式,models.get(i)每次单独从集合中获取元素,时间复杂度达到了O(n),并上外部的for循环,整个遍历时间复杂度达到了O(n^2);而第二种方式,通过增强的for循环,在第一次循环时直接取出元素,时间复杂度为O(n)。在数据量较大时,性能差别尤其大。
数据结构应用在方方面面,希望对大家能有所启迪。