jdk1.8集合框架源码解析(一)Iterable

集合在Java中是比较重要的,在日常的使用中经常使用到,了解其底层源码,有利于我们更好的使用它,

集合框架图:

Iterable接口有三个方法

   Iterator<T> iterator();

  
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

 
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }

通过 iterator方法可以获取到Iterator实体类,而Iterator是与迭代有关的类


Iterator源码如下:


    boolean hasNext();


    E next();


    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

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

其中

hasNext()判断是否有下个元素

next() 获取下一个元素

remove() 移除下一个元素,支持从源集合中安全地删除对象,这样做可以避免 ConcurrentModifiedException 

forEachRemaining() 对集合元素进行遍历消费。

Iterator默认方法
  
default void remove()移除下一个元素
 default void forEachRemaining(Consumer<? super E> action)对集合元素进行遍历消费

 


Iterable 接口中的默认方法

forEach(Consumer<? super T> action) 对集合进行遍历消费。

 spliterator() 获取 一个Spliterator对象。Spliterator是一个可分割迭代器(splitable iterator)  Spliterator就是为了并行遍历元素而设计的一个迭代器

下面对Spliterator源码进行解析

抽象方法

	/**
	 * 如果还有一个元素可以执行给定的操作返回true否则返回false
	 */
	boolean tryAdvance(Consumer<? super T> action);

	/**
	 * 对任务分割,返回一个新的Spliterator迭代器
	 */
	Spliterator<T> trySplit();

	/**
	 * 用于估算还剩下多少个元素需要遍历
	 */
	long estimateSize();

	/**
	 * 返回当前对象有哪些特征值
	 */
	int characteristics();

默认方法

/**
	 * 每个剩余元素执行给定的动作(tryAdvance方法),依次处理,直到所有元素已被处理或被异常终止
	 * @param action
	 */
	default void forEachRemaining(Consumer<? super T> action) {
		do { } while (tryAdvance(action));
	}

	/**
	 * 当迭代器拥与SIZED有关时,返回剩余元素个数;否则返回-1
	 * @return
	 */
	default long getExactSizeIfKnown() {
		return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
	}

	/**
	 * 是否具有当前特征值
	 * @param characteristics
	 * @return
	 */
	default boolean hasCharacteristics(int characteristics) {
		return (characteristics() & characteristics) == characteristics;
	}

	/**
	 * 如果Spliterator是通过Comparator排序的,则返回Comparator
	 * 如果Spliterator是通过自然排序的 ,则返回null
	 * 其他情况下抛错
	 * @return
	 */
	default Comparator<? super T> getComparator() {
		throw new IllegalStateException();
	}

8个特征值

	public static final int ORDERED    = 0x00000010;


	public static final int DISTINCT   = 0x00000001;


	public static final int SORTED     = 0x00000004;


	public static final int SIZED      = 0x00000040;


	public static final int NONNULL    = 0x00000100;


	public static final int IMMUTABLE  = 0x00000400;


	public static final int CONCURRENT = 0x00001000;


	public static final int SUBSIZED = 0x00004000;
8个特征值含义
特征值作用
ORDERED
元素被定义了一种指定的顺序,如list 索引
DISTINCT
元素不能重复
SORTED
元素被定义了一种指定的排序,如TreeSet 大小顺序
SIZED
特征值表示从estimateSize()遍历或分割之前返回的值 表示有限大小,在没有结构源修改的情况下,表示完全遍历将遇到的元素数量的精确计数。
NONNULL
元素不会为null
IMMUTABLE
特征值表示元素源不能在结构上进行修改; 也就是说,不能添加,替换或删除元素,因此在遍历过程中不会发生这种更改。
CONCURRENT
特征值表示可以通过多个线程安全同时修改元素源(允许添加,替换和/或删除),而无需外部同步。
SUBSIZED

特征值表示由所产生的所有Spliterator trySplit()都有SIZED的特征

内部接口 OfInt, OfDouble, OfLong以及OfPrimitive ,从代码里面可以看出来,结构大部分和Spliterator相同,这里介绍OfPrimitive 

    public interface OfPrimitive<T, T_CONS, T_SPLITR extends Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>>
            extends Spliterator<T> {
        @Override
        T_SPLITR trySplit();

        @SuppressWarnings("overloads")
        boolean tryAdvance(T_CONS action);

     
        @SuppressWarnings("overloads")
        default void forEachRemaining(T_CONS action) {
            do { } while (tryAdvance(action));
        }
    }

只是对tryAdvance()和forEachRemaining()增加了泛型

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值