说说自己踩到的坑
某个项目中遍历一个List
集合,该集合比较大,大概有几万条数据,我使用了for
循环遍历:
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
迭代器。
另外,还可以使用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
异常,所以要根据具体操作选取。