一.继承关系图
出处链接
二.Iterable 与 Iterator
在Java中,Iterable
和Iterator
是两个用于集合遍历的接口。
Iterator<T> iterator()
- 作用:这个方法是
Iterable
接口的核心。返回一个Iterator<T>
,用于遍历类型为T
的对象集合。 - 实现原理:实现
Iterable
接口的任何类都必须实现此方法,以提供一个可以迭代其元素的迭代器。
default void forEach(Consumer<? super T> action)
- 作用:此方法用于对
Iterable
的每个元素执行给定的操作,直到所有元素都被处理或操作抛出异常为止。 - 参数:
Consumer<? super T> action
:一个函数式接口,它接受一个类型为T
的输入并执行操作,通常不返回结果。
- 实现原理:使用
iterator()
方法来迭代Iterable
的元素,并对每个元素应用action
操作。使用Objects.requireNonNull(action)
确保如果传递的Consumer
为null时抛出NullPointerException
,这样强制action
不为空。 - 使用场景:lambda表达式。
default Spliterator<T> spliterator()
- 作用:该方法为
Iterable
中的元素提供一个Spliterator
。Spliterator主要用于提供对元素序列的高效并行迭代方式。 - 实现原理:通过
Spliterators.spliteratorUnknownSize(iterator(), 0)
方法创建一个Spliterator
。此方法使用由iterator()
方法提供的迭代器和初始特征0
(意味着要迭代的元素大小未知),并且Spliterator
没有额外的特征,如SORTED
或SIZED
。 - 使用场景:Spliterators在与Java的Streams API一起使用时非常有用,允许集合被顺序或并行处理。
Iterator<E>
接口是集合框架的一部分,用于遍历集合中的元素。
E next()
- 作用:
next()
方法用于返回迭代中的下一个元素。 - 实现原理:调用
next()
方法时,它将从集合中返回当前位置的元素,并将迭代器的位置向前移动一个单位。如果迭代器已经到达集合的末尾,再调用next()
方法将会抛出NoSuchElementException
。
default void remove()
- 作用:
remove()
方法用于从集合中移除next()
方法最后一次返回的元素。 - 实现原理:
remove()
方法是一个默认方法,其默认实现是抛出UnsupportedOperationException
,表示不支持删除操作。这是因为并非所有的迭代器都需要支持删除操作。
default void forEachRemaining(Consumer<? super E> action)
- 作用:
forEachRemaining(Consumer<? super E> action)
方法用于对迭代器剩余的每个元素执行给定的操作,直到所有元素都被处理或操作本身抛出异常。 - 实现原理:
- 首先,通过
Objects.requireNonNull(action)
检查传入的action
参数是否为null
,确保提供了一个有效的消费者行为。 - 然后,使用
while
循环遍历迭代器。循环中调用hasNext()
方法检查是否还有元素。如果有,就通过next()
方法获取下一个元素,并将其传递给action.accept()
方法进行处理。
- 首先,通过
总结
Iterable
接口
- 定义:
Iterable
是一个允许其内容被迭代的接口,它定义在java.lang
包中。 - 主要方法:
iterator()
:这个方法返回一个Iterator
实例,用于遍历集合中的元素。
- 使用场景:任何实现了
Iterable
接口的类的对象可以使用增强型for循环(也称为for-each循环)进行遍历。例如,所有实现了Collection
接口的类(如List
,Set
等)都实现了Iterable
接口。
Iterator
接口
- 定义:
Iterator
是一个用于遍历集合中元素的接口,定义在java.util
包中。 - 主要方法:
hasNext()
:检查集合中是否还有元素。next()
:返回集合中的下一个元素。remove()
:从集合中移除最近通过此迭代器返回的元素(可选操作)。
- 使用场景:
Iterator
是实现迭代逻辑的工具,通常用在需要明确控制集合中元素访问顺序的场合,或者在迭代过程中需要从集合中移除元素的场合。
区别
- 功能定位:
Iterable
提供了一种获取迭代器的方法,是对集合可遍历性的一个抽象;而Iterator
则提供了迭代的具体实现,包括元素的顺序访问和删除等操作。 - 所处包:
Iterable
位于java.lang
包中,是Java语言的核心部分;Iterator
位于java.util
包中,是集合框架的一部分。
总结
Iterable
提供了一种统一的方式来获取Iterator
,后者才是执行实际遍历的工具。- 通过调用
.iterator()
方法获得的迭代器并不直接指向集合的第一个元素,而是位于第一个元素之前的一个位置。可以将其视为一个头节点,它初始时位于集合的“开始位置之前”。这是为了允许迭代器在开始遍历前有一个统一的起点。 - 使用迭代器的 remove() 方法时,它并不是移除下一个元素,而是移除最近通过 next() 方法返回的元素。这意味着迭代器在调用 next() 之后,其“当前位置”视为刚刚通过 next() 方法访问过的那个元素。随后调用 remove() 将删除这个“当前位置”的元素。
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
Iterator<String> iterator = list.iterator();
if (iterator.hasNext()) {
System.out.println(iterator.next()); // 输出 "Apple",迭代器现在位于Apple之后
}
iterator.remove(); // 删除 "Apple"
code
- 解释:可以看到ArrayList通过内部类实现了属于自己的
Iterator
,用来给Iterable
的iterator
方法返回一个迭代器
三.List
1.ArrayList
ArrayList源码分析(基于JDK8)
手写ArrayList
2.LinkedList
四.Set
1.HashSet
2.TreeSet
待整理