关于集合的遍历
Java中关于ArrayList和LinkedList遍历效率
Java中经常会使用List进行遍历,随着数据量不断增大,遍历很大数据的时候,发现执行效率炸了,灰常慢,翻了日志,发现在遍历数据List中巨慢,一直在循环。
查了下资料,测试了下两种LinkedList,ArrayList方式。
开始遍历100万条数据,分别使用迭代器Iterator,foreach,for方式进行遍历。
首先对LinkedList进行三种方式遍历.
结果如下:
此时会发现foreach和迭代器效率相近,foreach所需遍历时间最短,而for循环效率非常低。
之后对ArrayList进行三种方式的遍历.
结果如下:
结果表明,三种方式下,for循环遍历时间最少,而迭代器遍历最慢。
ArrayList底层实现是数组object,而LinkedList底层实现是双向链表(JDK1.7开始)。
故ArrayList具有随机访问的特性,实现了RandomAccess接口,查找的效率高。缺点就是插入和删除元素效率低,若是插入末端时间复杂度为O(1),若插入在数组中间i位置(1<i<n),则后续元素需要移动(n-i)次,时间复杂度为O(n)。由于数组连续存储,内存空间占用小,但是ArrayList需要在尾部留一部分空间。
而LinkedList底层实现为双向链表,双向链表单节点结构为指向前驱节点的指针、Data、指向后驱节点的指针,故内存空间占用比数组大。链表具有插入、删除方便的特征,只需将指针断开重定向即可,时间复杂度近乎为O(1)。但是查找方面由于是双向链表平均查找时间都为(n/2),故时间复杂度为O(n)。
结论:
实现RandomAccess接口的List,一般推荐for循环进行遍历,效率高。
而普通的不支持随机访问的,最好使用迭代器进行遍历或者foreach(底层对于List也是用迭代器实现)。对于大数据量的遍历,一定不能用for循环,不然效率特别低,基本上就废了。