顺序表的迭代能力和迭代器

本文详细介绍了Java中Iterable接口和Iterator接口的应用,展示了顺序表(如ArrayList)的迭代过程,包括如何创建迭代器,常用方法hasNext()和next()的使用,以及for-each循环和while循环的迭代示例。
摘要由CSDN通过智能技术生成

迭代

元素(Element):被管理的原子数据,元素类型不限。
集合(Collection):存放元素的容器,需要利用一定的数据结构知识对元素进行组织。
迭代(Iterate)/遍历(Traversal):在数据结构的语境下,往往表示对一个集合中的所有元素都按照一定的顺序处理一次。

Java中常见的Iterate接口和继承的类

TODO:图片

顺序表ArrayList的继承链条简单版:
TODO:图片

顺序表的迭代能力和迭代器

每种容器(Collection)都是具备迭代能力(Iterable)的。所以每种容器都自带一个方法返回一个适合的迭代器(Iterator)以对容器进行无视实现差别的迭代。

迭代能力和迭代器的接口经常使用的方法

import java.util;
/**
 * 迭代能力的接口表示具备迭代能力的。
 *       参数类型
 *      T - 迭代器返回的元素的类型
 */
public interface Iterable<T> {

//    返回类型为 T元素的迭代器。

    Iterator<T> iterator();

}

Iterable接口 表示可以被迭代的,其中的iterator()方法,返回迭代器,通过迭代器可以实现进一步的迭代。

import java.util;
/**
 * 迭代器,提供无视具体实现,遍历容器中每个元素的能力
 * 参数类型
 * E - 此迭代器返回的元素的类型
 */
public interface Iterator<E> {
    //如果迭代还有下一个元素,则返回true 。 (换句话说,如果next()返回一个元素而不是抛出一个异常,则返回true )
    boolean hasNext();

    //    返回迭代中的下一个元素。
    E next();

    //    从底层集合中删除此迭代器返回的最后一个元素(可选操作)。 此方法只能调用一次next() 。
// 如果底层集合在迭代过程中以任何方式进行修改而不是通过调用此方法,则迭代器的行为是未指定的。
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

}

Iterator接口是迭代器,boolean hasNext();方法是用来判断容器内是否还有下一个元素没有迭代,返回boolea类型。
E next();方法是用来返回此时容器内的下一个元素,同时跳过该元素,表示这个元素已经被迭代了。基于hasNext()方法返回true,说明容器内右下一个元素,如果没有下一个元素则抛出异常:NoSuchElementException - 如果迭代没有更多的元素 。

代码示例

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

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();

        list.add(1);
        list.add(2);
        list.add(3);

//        Iterable<Integer> iterable = list;
//        Iterator<Integer> iterator = iterable.iterator();

//        上面这两步可以简化为下面这一步。
        Iterator<Integer> iterator = list.iterator();
                
        System.out.println(iterator.hasNext());
        System.out.println(iterator.next());

        System.out.println(iterator.hasNext());
        System.out.println(iterator.next());

        System.out.println(iterator.hasNext());
        System.out.println(iterator.next());

        System.out.println(iterator.hasNext());

//        System.out.println(iterator.next());//实现这一步会抛出异常java.util.NoSuchElementException

    }
}

打印输出内容为:

true
1
true
2
true
3
false

搭配while循环使用也能达到迭代输出容器中的每个元素的效果。

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

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();

        list.add(1);
        list.add(2);
        list.add(3);

        Iterator<Integer> iterator = list.iterator();
        //只要还有下一个元素,循环就继续
        while (iterator.hasNext()) {
            //获取下一个元素,并让迭代器走到next()之后的位置
            System.out.println(iterator.next());
        }
    }
}

输出结果:

1
2
3

补充:凡是具备迭代能力的对象,都可以使用for-each语法进行每个元素的遍历。

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();

        list.add(1);
        list.add(2);
        list.add(3);

        for (int num : list) {
            System.out.println(num);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值