JDK8源码之Spliterator并行遍历迭代器

Spliterator是JDK1.8引入的可分割迭代器,设计用于并行处理。它具备特征值以优化遍历,并且ArrayList实现了Spliterator。Spliterator内部结构包括特征值和获取比较器的方法。ArrayListSpliterator通过index和fence控制遍历范围,不支持遍历过程中对list的结构变更。Spliterator衍生了OfPrimitive接口,如OfInt,用于特定类型的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spliterator是什么?

public interface Spliterator<T> {
  

Spliterator是一个可分割迭代器(splitable iterator),可以和iterator顺序遍历迭代器一起看。jdk1.8发布后,对于并行处理的能力大大增强,Spliterator就是为了并行遍历元素而设计的一个迭代器,jdk1.8中的集合框架中的数据结构都默认实现了spliterator,后面我们也会结合ArrayList中的spliterator()一起解析。

Spliterator内部结构

 //单个对元素执行给定的动作,如果有剩下元素未处理返回true,否则返回false
 boolean tryAdvance(Consumer<? super T> action);

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

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

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

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

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

 //是否具有当前特征值
 default boolean hasCharacteristics(int characteristics) {
    return (characteristics() & characteristics) == characteristics;
 }
 //如果Spliterator的list是通过Comparator排序的,则返回Comparator
 //如果Spliterator的list是自然排序的 ,则返回null
 //其他情况下抛错
 default Comparator<? super T> getComparator() {
     throw new IllegalStateException();
 }

特征值其实就是为表示该Spliterator有哪些特性,用于可以更好控制和优化Spliterator的使用。关于获取比较器getComparator这一个方法,目前我还没看到具体使用的地方,所以可能理解有些误差。特征值如下:(部分属于猜测)

 //
 public static final int ORDERED    = 0x00000010;
 //
 public static final int DISTINCT   = 0x00000001;
 //排序
 public static final int SORTED     = 0x00000004;
 //大小
 public static final int SIZED      = 0x00000040;
 //没有null
 public static final int NONNULL    = 0x00000100;
 public static final int IMMUTABLE  = 0x00000400;
 public static final int CONCURRENT = 0x00001000;
 public sta
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值