Java Iterator Iterable

Iterator接口

这个接口下的方法:
在这里插入图片描述
一个简单的例子先让你了解迭代器模式:
https://download.csdn.net/download/weixin_43860530/12347734

Iterator 是个接口,定义了几个方法:
(迭代位置也称游标,它本身不知向任何元素,我们可以把它理解为两个元素之间的位置)

  1. hasNext(),返回是否有下一个元素。
  2. next(),获取下一个元素,迭代位置往后移一位。
  3. remove(),删除最后一次next()返回的元素,比如我们执行了next()之后,在执行remove(),就会删除容器中的刚刚执行next()时返回的元素。
  4. forEachRemaining(Consumer<? super E> action) 遍历剩余元素,并执行给定操作

Iterable接口

在这里插入图片描述

  1. iterator(),返回迭代器
  2. spliterator(),返回spliterator
  3. forEach(Consumer<? super T>)遍历每一个容器内元素

Iterable和Iterator的区别和联系:
       我们发现Collection是实现Iterable的,不仅仅是它,很多集合类都是实现Iterable,那为什么不直接实现Iterator呢,要绕个弯呢?有一个重要的原因就是:如果直接实现Iterator接口,那必须在容器内重写next()和hasNext()方法,而这两个方法肯定需要一个变量用来保存当前迭代位置,所以这个变量肯定会在容器内声明,当容器出现添加或者删除等改变操作时,迭代器位置就需要一系列操作使其对应到新的位置,如果是实现Iterable,须在iterator()返回一个自定义的Iterator,每次调用iterator()都可以返回一个从头开始迭代的迭代器。而且多个迭代器之间不相互干扰。

ListIterator

继承了Iterator,对Iterator进行扩展:
在这里插入图片描述

  1. hasPrevious(),判断前面是否有元素
  2. previous(),返回前面元素,迭代位置往前移一位
  3. nextIndex(),返回后一个元素索引位置
  4. previousIndex(),返回前一个元素索引位置
  5. add(E),在迭代位置前插入一个元素
  6. set(E),更新最后一次next()返回的元素

看个例子:
AbstractList.java中有个内部类实现了ListIterator

private class ListItr extends AbstractList<E>.Itr implements ListIterator<E> {
        ListItr(int var2) {
            super(null);
            this.cursor = var2;
        }

        public boolean hasPrevious() {
            return this.cursor != 0;
        }

        public E previous() {
            this.checkForComodification();

            try {
                int var1 = this.cursor - 1;
                Object var2 = AbstractList.this.get(var1);
                this.lastRet = this.cursor = var1;
                return var2;
            } catch (IndexOutOfBoundsException var3) {
                this.checkForComodification();
                throw new NoSuchElementException();
            }
        }

        public int nextIndex() {
            return this.cursor;
        }

        public int previousIndex() {
            return this.cursor - 1;
        }

        public void set(E var1) {
            if (this.lastRet < 0) {
                throw new IllegalStateException();
            } else {
                this.checkForComodification();

                try {
                    AbstractList.this.set(this.lastRet, var1);
                    this.expectedModCount = AbstractList.this.modCount;
                } catch (IndexOutOfBoundsException var3) {
                    throw new ConcurrentModificationException();
                }
            }
        }

        public void add(E var1) {
            this.checkForComodification();

            try {
                int var2 = this.cursor;
                AbstractList.this.add(var2, var1);
                this.lastRet = -1;
                this.cursor = var2 + 1;
                this.expectedModCount = AbstractList.this.modCount;
            } catch (IndexOutOfBoundsException var3) {
                throw new ConcurrentModificationException();
            }
        }
    }

AbstractList还有另一个内部类实现了Iterator

private class Itr implements Iterator<E> {
        int cursor;
        int lastRet;
        int expectedModCount;

        private Itr() {
            this.cursor = 0;
            this.lastRet = -1;
            this.expectedModCount = AbstractList.this.modCount;
        }

        public boolean hasNext() {
            return this.cursor != AbstractList.this.size();
        }

        public E next() {
            this.checkForComodification();

            try {
                int var1 = this.cursor;
                Object var2 = AbstractList.this.get(var1);
                this.lastRet = var1;
                this.cursor = var1 + 1;
                return var2;
            } catch (IndexOutOfBoundsException var3) {
                this.checkForComodification();
                throw new NoSuchElementException();
            }
        }

        public void remove() {
            if (this.lastRet < 0) {
                throw new IllegalStateException();
            } else {
                this.checkForComodification();

                try {
                    AbstractList.this.remove(this.lastRet);
                    if (this.lastRet < this.cursor) {
                        --this.cursor;
                    }

                    this.lastRet = -1;
                    this.expectedModCount = AbstractList.this.modCount;
                } catch (IndexOutOfBoundsException var2) {
                    throw new ConcurrentModificationException();
                }
            }
        }

        final void checkForComodification() {
            if (AbstractList.this.modCount != this.expectedModCount) {
                throw new ConcurrentModificationException();
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Iterable接口是Java集合框架中的一个重要接口。它是一个泛型接口,用于表示可以迭代的对象集合。Iterable接口定义了一个方法iterator(),该方法返回一个Iterator对象,用于遍历集合中的元素。 在实现Iterable接口的类中,必须实现iterator()方法,并返回一个实现了Iterator接口的对象。Iterator接口提供了一些方法,如hasNext()用于判断集合中是否还有下一个元素,next()用于获取下一个元素。 通过实现Iterable接口,我们可以使用增强型for循环来遍历集合中的元素。例如: ```java public class MyCollection<T> implements Iterable<T> { private T[] elements; // 省略其他代码 @Override public Iterator<T> iterator() { return new MyIterator(); } private class MyIterator implements Iterator<T> { private int currentIndex = 0; @Override public boolean hasNext() { return currentIndex < elements.length; } @Override public T next() { return elements[currentIndex++]; } } } // 使用示例 MyCollection<Integer> collection = new MyCollection<>(); // 添加元素到集合中 for (int num : collection) { System.out.println(num); } ``` 在上面的例子中,MyCollection类实现了Iterable接口,并提供了一个内部类MyIterator来实现Iterator接口。通过调用collection的iterator()方法,我们可以获取一个Iterator对象,并使用增强型for循环来遍历集合中的元素。 通过实现Iterable接口,我们可以方便地在Java中对集合进行迭代和遍历。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值