java 中for 与 for each的比较

原创
2017/02/20 11:51
阅读数 316

对于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遍历。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部