java 中for 与 for each的比较

本文探讨了Java中遍历ArrayList与LinkedList的不同方式及其性能差异。通过对for循环与foreach方式进行测试,展示了不同List类型在遍历效率上的表现,并分析了foreach在内部如何实现。

对于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)forfor each
ArrayList36
LinkedList679

以下是对长度为100,000的ArrayList与LinkedList 分别以 for与foreach进行测试

单位(ms)forfor each
ArrayList910
LinkedList565514

通过遍历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遍历。

转载于:https://my.oschina.net/weechang93/blog/841949

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值