集合在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() 对集合元素进行遍历消费。
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;
特征值 | 作用 |
| 元素被定义了一种指定的顺序,如list 索引 |
| 元素不能重复 |
| 元素被定义了一种指定的排序,如TreeSet 大小顺序 |
| 特征值表示从estimateSize()遍历或分割之前返回的值 表示有限大小,在没有结构源修改的情况下,表示完全遍历将遇到的元素数量的精确计数。 |
| 元素不会为null |
| 特征值表示元素源不能在结构上进行修改; 也就是说,不能添加,替换或删除元素,因此在遍历过程中不会发生这种更改。 |
| 特征值表示可以通过多个线程安全同时修改元素源(允许添加,替换和/或删除),而无需外部同步。 |
| 特征值表示由所产生的所有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()增加了泛型