说说自己踩到的坑
某个项目中遍历一个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异常,所以要根据具体操作选取。
来源:oschina
链接:https://my.oschina.net/u/2309076/blog/707141