对于java中的遍历方式我相信大家都不陌生。每个人应该都能说出几种遍历方式。
NO1.最常用,也是最开始接触到的遍历方式。
for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + ",");}
NO2.最生僻,属于基本不怎么用的方式。
Iterator iterator = list.iterator();while (iterator.hasNext()) { System.out.print(iterator.next() + ",");}
NO3.最简洁,语法糖方式。
for (Integer i : list) { System.out.print(i + ",");}
对于以上的三种方式,在此主要讨论NO1与NO3的遍历方式。
对于for 与 for each的遍历的效率我们应该区别对待。
以下是对长度为10,000的ArrayList与LinkedList 分别以 for与foreach进行测试
单位(ms) | for | for each |
ArrayList | 3 | 6 |
LinkedList | 67 | 9 |
以下是对长度为100,000的ArrayList与LinkedList 分别以 for与foreach进行测试
单位(ms) | for | for each |
ArrayList | 9 | 10 |
LinkedList | 5655 | 14 |
通过遍历ArrayList 与 LinkedList 我们可以发现:
1.用for each 遍历的时候,ArrayList 与 LinkedList的效率相差不大。
2.用for 遍历的时候,ArrayList 的效率大大优于 LinkedList的效率。
具体我们可以反编译for each查看其实现。
foreach反编译前
for (Integer i : list) { System.out.println(i);}
foreach反编译结果
Integer i; for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(i)){ i = (Integer)iterator.next(); }
由此我们可以知道foreach的遍历其实与NO2.差不多,这种遍历很适合LinkedList。而for循环遍历LinkedList需要遍历链表。成本自让就上升了。
在不知道遍历List具体实现的时候,采用foreach遍历效率最优。
当然到了这里你以为就完了吗?并没有,对于采用for循环我们可以在循环中改变List的结构。但是对于foreach循环,如果在循环中改变结构,则会出现
ConcurrentModificationException异常。
对于在循环中要改变List结构的循环,只能采用for遍历。