某个项目中遍历一个List
集合,该集合比较大,大概有几万条数据,我使用了for
循环遍历:java
public void readList(List<String> list) { if (list != null) { for (int i=0; i<list.size(); i++) { // do something... } } }
作测试的时候发现程序执行特别慢,找了很久找到了缘由,就是上面的方法中的问题:因为方法参数中给定的List
集合多是ArrayList
,也多是LinkedList
。当遍历LinkedList
的时候,若是集合很大,会出现程序执行效率慢的问题。数组
将上面的方法重构:测试
public void readList(List<String> list) { if (list != null) { Itarator<String> iter = list.iterator(): while (iter.hasNext()) { // do something... } } }
重构后程序执行确实快了很多,这源于ArrayList
和LinkedList
内部实现的区别,LinkedList
随机读取要比ArrayList
慢,关于ArrayList
和LinkedList
区别很少说了,其余网站有不少异同点的比较。网站
除非遍历的过程当中要获取集合中元素的索引使用for
循环,不然遍历集合尽可能使用Iterator
迭代器。code
另外,还可使用forEach
循环:索引
public void readList(List<String> list) { if (list != null) { for (String str : list) { // do something... } } }
forEach
循环是Iterator
写法的简化版,也不用担忧数组越界,它的内部实现也是使用Iterator
迭代器(能够经过反编译后查看)。不过功能上没有Iterator
强大,好比在forEach
调用集合的remove()
方法会致使java.util.ConcurrentModificationException
异常,因此要根据具体操做选取。rem