Java基础复习笔记--Iterator和增强for的比较

本文探讨了Java中的Iterator接口与for each循环在遍历集合时的区别。通过实例展示了如何使用Iterator删除集合元素,以及增强for循环在不支持删除操作但可修改元素的情况。总结指出,两种遍历方式各有优劣,根据实际需求选择合适的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Iterator是Java中的一个迭代器接口(Interface),用来提供标准的Java迭代器
Iterator支持泛型因为集合(Collection)类可以装入的类型是不确定的,从集合中取出的都是Object类型,加入泛型,就是告诉编译器确定要装入的对象类型,取值时就无需强制转换了。

for each 是 Java 5 中新增的一个循环结构,本质上是一个Iterator,特点是可以用来遍历集合元素而不用考虑集合下标。

综合实例:

package net.csdn.fortest;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorDemo {
/**

  • Iterator和for each的综合例子
    @param args
    /
    public static void main(String[] args) {
    //创建一个list并设置泛型为Emp类型
    List<Emp> list = new ArrayList<Emp>();
    //添加Emp实例到list
    list.add(new Emp(“one”));
    list.add(new Emp("
    "));
    list.add(new Emp(“two”));
    list.add(new Emp("
    "));
    list.add(new Emp(“three”));
    list.add(new Emp(""));
    //使用list的iterator()方法返回一个迭代器
    Iterator<Emp> it = list.iterator();
    //hasNext() Iterator中的一个方法,判断是否有下一个元素
    while(it.hasNext()) {
    //如果Emp对象中的name的值是则删除该元素
    if("*".equals(it.next().getName())){
    it.remove();
    }
    }
    System.out.println(list);
    //增强for循环用于遍历集合,但不适合对集合进行删除操作
    //但是可以进行修改
    for(Emp e : list) {
    list.set(1,new Emp(“1”));
    System.out.print(e.getName()+" ");
    }
    }
    }
    /**
  • Emp类
    * @author haydn

*/
class Emp {
private String name;
public Emp(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return name;
}
}

运行结果:
[one, two, three]
one 1 three

Iterator和 for each的区别:
1.for each 不能删除集合元素
2.Iterator 只能使用自身的remove()方法来删除元素,不能用集合的删除操作
3.ArrayList里,for循环较快,LinkedList里,使用iterator较快.

为什么ArrayList的遍历中for比Iterator快,而LinkedList中却是Iterator远快于for?这得从ArrayList和LinkedList两者的数据结构说起了:

ArrayList 是基于索引(index)的数组,索引在数组中搜索和读取数据的时间复杂度是O(1),但是要增加和删除数据却是开销很大的,因为这需要重排数组中的所有数据。

LinkedList 的底层实现则是一个双向循环带头节点的链表,因此LinkedList中插入或删除的时间复杂度仅为O(1),但是获取数据的时间复杂度却是O(n)。

明白了两种List的区别之后,就知道,ArrayList用for循环随机读取的速度是很快的,因为ArrayList的下标是明确的,读取一个数据的时间复杂度仅为O(1)。但LinkedList若是用for来遍历效率很低,读取一个数据的时间复杂度就达到了为O(n)。而用Iterator的next()则是顺着链表节点顺序读取数据的效率就很高了。

总结:这两种遍历方式各有特色,优势各有不同,在处理不同情景下的数据,利用好它们的长处能使程序运行的更好。

参考:https://blog.youkuaiyun.com/shf4715/article/details/47029049 https://blog.youkuaiyun.com/OrPis/article/details/80839303
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值