java中的迭代器

本文介绍了Java中迭代器的概念及其在不同容器中的应用。解释了迭代器如何简化对容器内元素的操作,无需关注容器的具体类型。此外,还对比了迭代器与foreach循环在不同容器上的性能表现。

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

1.为什要使用迭代器?

   Java容器的种类有很多种,比如ArrayList、LinkedList、HashSet...,每种容器都有自己的特点,ArrayList底层维护的是一个数组;LinkedList是链表结构的;HashSet依赖的是哈希表,每种容器都有自己特有的数据结构。因为容器的内部结构不同,很多时候可能不知道该怎样去遍历一个容器中的元素。所以为了使对容器内元素的操作更为简单,使用容器时不用关心容器的类型,java引入了迭代器模式。

2.迭代器(Iterator) 

      迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

3.Java中的Iterator功能比较简单,并且只能单向移动:

  (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

  (2) 使用next()获得序列中的下一个元素。

  (3) 使用hasNext()检查序列中是否还有元素。

  (4) 使用remove()将迭代器新返回的元素删除。

  Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

4.迭代器接口定义:

public interface Iterator<E> {
    boolean hasNext();            //判断是否存在下一个对象元素
    E next();                     //获取下一个元素
    void remove();                //移除元素  
}

5.java中提供了一个Iterator接口,它的功能是返回一个迭代器,该接口实现的子接口有:Collection,List,Set。

使用迭代器遍历集合:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class testIterator {
    public static void main(String[] args) {
        List<String> list=new ArrayList<String>();
        list.add("abcd");
        list.add("efgh");
        list.add("jklm");
        list.add("Word");
        list.add("Holle");
        Set<Integer> set=new HashSet<Integer>();
        set.add(12);
        set.add(34);
        set.add(56);
        set.add(78);
        set.add(90);
        System.out.println(list);
        System.out.println(set);
        Iterator<String> i=list.iterator();     //使用迭代器遍历list
        System.out.println("list遍历后:");
        while(i.hasNext()) {
            String s=i.next();
            System.out.println(s);
        }
        Iterator<Integer> i1=set.iterator();      //使用迭代器遍历set
        System.out.println("set遍历后:");
        while(i1.hasNext()) {
            Integer it= i1.next();
            System.out.println(it);
        }
    }
}

运行结果:

[34, 56, 90, 12, 78]
list遍历后:
abcd
efgh
jklm
Word
Holle
set遍历后:
34
56
90
12
78

相对于迭代器,foreach遍历集合代码更加的简洁,不容易出错。

import java.util.ArrayList;
import java.util.List;
public class TestForeach {
	public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("abcd");
		list.add("efgh");
		list.add("jklm");
		list.add("Word");
		list.add("Holle");
		System.out.println(list);
		System.out.println("list通过foreach遍历后:");
		for(String s:list){
			System.out.println(s);
		}
 }
}

运行结果:

[abcd, efgh, jklm, Word, Holle]
list通过foreach遍历后:
abcd
efgh
jklm
Word
Holle

6.for循环和迭代器的对比:

   >ArrayList对随机访问比较快,而for循环中使用的get()方法,采用的即是随机访问的方法,因此在ArrayList里for循环快。

 > LinkedList则是顺序访问比较快,Iterator中的next()方法采用的是顺序访问方法,因此在LinkedList里使用Iterator较快。

   >从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.

  >如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值