学习Java的集合框架之Iterable

最近学习了Java的集合框架,现在将其总结一下。

上面就是框架的大致类图。


说Iterable接口前先说一下Iterator:

这是一个对集合进行迭代的一个迭代器。见下面的源码

package java.util;
import java.util.function.Consumer;
public interface Iterator<E> {
   
    boolean hasNext();//如果仍有元素可以迭代,则返回true

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

    //从迭代器指向的Collection中移除迭代器返回的最后一个元素
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

使用Iterator遍历容器的元素

public class Test {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        Iterator<Integer> iterator=list.iterator();
        while(iterator.hasNext()){
            Integer integer=iterator.next();
            System.out.println(integer);
        }
    }
}
输出结果:
1
2
3
4
5

Process finished with exit code 0

我们有时候要在遍历容器时,删除某一个元素,可能有人会这样子做。

public class Test {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        Iterator<Integer> iterator=list.iterator();
        while(iterator.hasNext()){
            Integer integer=iterator.next();
            if(integer.equals(2)){
               list.remove(integer);
            }
            System.out.println(integer);
        }
    }
}
输出结果:
1
2
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
	at java.util.ArrayList$Itr.next(ArrayList.java:859)
	at com.demo.Test.main(Test.java:17)

Process finished with exit code 1
如果要避免上述异常,我们不使用容器的删除方法,而是直接调用Iterator的删除方法
public class Test {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        Iterator<Integer> iterator=list.iterator();
        while(iterator.hasNext()){
            Integer integer=iterator.next();
            if(integer.equals(2)){
               iterator.remove();
            }
            System.out.println(integer);
        }
    }
}

输出结果:
1
2
3
4
5

Process finished with exit code 0

报错的原因跟Iterator的实现源码有关,具体可以参见篇博客https://www.cnblogs.com/snowater/p/8024776.html


接着我们可以来说一下Iterable这个接口了。   

迭代器(Iterator)主要用来操作java中的集合对象(Collection),迭代器提供了统一的语法进行集合对象(Collection)遍历操作,无需关心集合对象内部的实现方式,java提供了一个迭代器接口Iterator,Iterator只能向前移,无法后退;
 

先看一下其源码

package java.lang;

import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;

public interface Iterable<T> {
   
    //返回一个内部元素为T类型的迭代器
    Iterator<T> iterator();

    //一种新的遍历集合的方式,对内部元素进行遍历,并对元素进行指定的操作,JDK1.8添加
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
   //创建并返回一个可分割迭代器,JDK1.8添加
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值