java基础入门学习09-迭代器

一、引言

迭代器是设计模式的一种,迭代器模式提供方法来访问容器中的的元素,这听起来跟c语言中指针十分相似,其实数组访问中的指针本质上就是迭代器的一种。Iterrator对象就是迭代器,而iterator() 是 Java 集合框架中的一个方法,它返回一个 Iterator 对象,该对象可以用来遍历集合中的元素。

二、迭代器

2.1 迭代器对象的创建

在讲如何创建迭代器对象之前首先需要了解的是迭代器的种类,这里引用一下FASTR博主中的类结构图来说明
在这里插入图片描述
通过底层代码的查看我们可以发现在Iterable接口中有一个Iterator方法,它返回一个Iterator对象。

public interface Iterable<T> {
    /**
     * Returns an iterator over elements of type {@code T}.
     *
     * @return an Iterator.
     */
    Iterator<T> iterator();

而Iterator对象中则是拥有三个方法

public interface Iterator<E> {
    boolean hasNext();
    E next();
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
返回值类型方法名功能
booleanhasNext()判断集合是否还有元素,如果返回 true 表示集合还有元素,返回 false 表示集合中没有元素
Enext()获取集合中的下一个元素,通常搭配hasNext()来使用,判断出存在元素再使用该方法获取下一个元素
voidremove()删除集合中的元素。

在了解了类结构图之后我们就可以使用iterator()方法来创建对应的迭代器对象。

2.2 迭代器的使用

我们先来看一下最常见的ArrayList集合的迭代器使用案例

package pojo;

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

public class IteTest {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()) {
            int value = iterator.next();
            System.out.print(value + " ");
        }
    }
}

运行结果为:
在这里插入图片描述
在该案例中,首先hasNext()方法的指针先指向1,确定存在该元素后打印,然后是2,3。在3之后由于没有下一个元素就会跳出while循环。
上述案例演示了hasNext和next方法的基本使用,那么remove()其实在迭代器中的使用也十分简单

package pojo;

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

public class IteTest {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()) {
            int value = iterator.next();
            if(value == 1) iterator.remove();
        }
        System.out.println("删除后" + list);
    }
}

运行结果为:元素1被删除
在这里插入图片描述
那么Iterator的子类ListIterator有什么特殊之处呢。它允许程序员在列表(如 ArrayList、LinkedList 等)中双向遍历,同时支持元素的添加和删除操作。我们可以看一下底层代码中对几个新方法的描述

    /**
     * Returns {@code true} if this list iterator has more elements when
     * traversing the list in the reverse direction.  (In other words,
     * returns {@code true} if {@link #previous} would return an element
     * rather than throwing an exception.)
     *
     * @return {@code true} if the list iterator has more elements when
     *         traversing the list in the reverse direction
     */
    boolean hasPrevious();

    /**
     * Returns the previous element in the list and moves the cursor
     * position backwards.  This method may be called repeatedly to
     * iterate through the list backwards, or intermixed with calls to
     * {@link #next} to go back and forth.  (Note that alternating calls
     * to {@code next} and {@code previous} will return the same
     * element repeatedly.)
     *
     * @return the previous element in the list
     * @throws NoSuchElementException if the iteration has no previous
     *         element
     */
    E previous();

    /**
     * Returns the index of the element that would be returned by a
     * subsequent call to {@link #next}. (Returns list size if the list
     * iterator is at the end of the list.)
     *
     * @return the index of the element that would be returned by a
     *         subsequent call to {@code next}, or list size if the list
     *         iterator is at the end of the list
     */
    int nextIndex();

    /**
     * Returns the index of the element that would be returned by a
     * subsequent call to {@link #previous}. (Returns -1 if the list
     * iterator is at the beginning of the list.)
     *
     * @return the index of the element that would be returned by a
     *         subsequent call to {@code previous}, or -1 if the list
     *         iterator is at the beginning of the list
     */
    int previousIndex();
        /**
     * Replaces the last element returned by {@link #next} or
     * {@link #previous} with the specified element (optional operation).
     * This call can be made only if neither {@link #remove} nor {@link
     * #add} have been called after the last call to {@code next} or
     * {@code previous}.
     *
     * @param e the element with which to replace the last element returned by
     *          {@code next} or {@code previous}
     * @throws UnsupportedOperationException if the {@code set} operation
     *         is not supported by this list iterator
     * @throws ClassCastException if the class of the specified element
     *         prevents it from being added to this list
     * @throws IllegalArgumentException if some aspect of the specified
     *         element prevents it from being added to this list
     * @throws IllegalStateException if neither {@code next} nor
     *         {@code previous} have been called, or {@code remove} or
     *         {@code add} have been called after the last call to
     *         {@code next} or {@code previous}
     */
    void set(E e);

    /**
     * Inserts the specified element into the list (optional operation).
     * The element is inserted immediately before the element that
     * would be returned by {@link #next}, if any, and after the element
     * that would be returned by {@link #previous}, if any.  (If the
     * list contains no elements, the new element becomes the sole element
     * on the list.)  The new element is inserted before the implicit
     * cursor: a subsequent call to {@code next} would be unaffected, and a
     * subsequent call to {@code previous} would return the new element.
     * (This call increases by one the value that would be returned by a
     * call to {@code nextIndex} or {@code previousIndex}.)
     *
     * @param e the element to insert
     * @throws UnsupportedOperationException if the {@code add} method is
     *         not supported by this list iterator
     * @throws ClassCastException if the class of the specified element
     *         prevents it from being added to this list
     * @throws IllegalArgumentException if some aspect of this element
     *         prevents it from being added to this list
     */
    void add(E e);

E previous() 返回列表中的前一个元素,并将迭代器位置向后移动一个位置。
int nextIndex() 返回对 next 的后续调用将返回的元素的索引(在正向遍历列表中时)。
int previousIndex() 返回对 previous 的后续调用将返回的元素的索引(在反向遍历列表中时)。
void set(E e) 用指定的元素替换上次 next 或 previous 访问的元素(可选操作)。
void add(E e) 将指定的元素插入列表(可选操作)。该元素将插入到 next 或 previous 最后一次访问的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值