在学习集合源码之前,我们应对集合家族有一个清晰的理解。
一、Iterator迭代器
public interface Iterator<E> {
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() : 从迭代器指定的集合中移除迭代器返回的最后一个元素。
forEachRemaining(Consumer<? super E> action) : jdk8为Iterator新增的默认方法,该方法可以使用Lambda表达式来遍历集合元素
二、Iterable<T>
public interface Iterable<T> {
Iterator<T> iterator();
//传入一个Consumer类参数,通过调用Consumer里面的accept方法进行遍历
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<T> 。实现Iterable需要重写。
forEach(Consumer<? super T> action) :循环容器中的元素,并对每个元素进行 action 操作,容器中不能有空元素,否则或抛出 NullPointerException 指针异常。
spliterator():spliterator 方法没有参数,返回一个 Spliterator<T> 对象,Spliterator接口是1.8新加的接口,字面意思可分割的迭代器,不同以往的iterator需要顺序迭代,Spliterator可以分割为若干个小的迭代器进行并行操作,既可以实现多线程操作提高效率,又可以避免普通迭代器的fail-fast机制所带来的异常。
default的作用
- Default 方法带来的好处是,往接口新增一个Default 方法,而不破坏现有的实现架构。
- Default方法可以认为是Lambda表达式和JDK类库之间的桥梁。引入Default方法的主要目的是为了升级标准JDK接口,另外也是为了我们最终能在Java8中顺畅使用Lambda表达式。
@contract注解
两个属性
- value 属性-包含-描述-调用参数-和返回值-之间的-因果关系-的 contract 子句。
- pure 属性-适用于-不更改-其对象状态-的方法,但只返回一个新值。该属性可以-用作-“忽略方法-调用的-结果”检查的-提示,以-指示-在调用时-应该-使用方法的-返回值。它是假(false)(默认情况下),也可以为真(true)。