集合的整体框架结构及依赖关系
1.Collection
public interface Collection<E> extends Iterable<E> {}
Collection是一个高度抽象出来的集合,包含了集合添加,删除等基本操作,主要分支为List,Set,Queue.
// Collection的API
abstract boolean add(E object)
abstract boolean addAll(Collection<? extends E> collection)
abstract void clear()
abstract boolean contains(Object object)
abstract boolean containsAll(Collection<?> collection)
abstract boolean equals(Object object)
abstract int hashCode()
abstract boolean isEmpty()
abstract Iterator<E> iterator()
abstract boolean remove(Object object)
abstract boolean removeAll(Collection<?> collection)
abstract boolean retainAll(Collection<?> collection)
abstract int size()
abstract <T> T[] toArray(T[] array)
abstract Object[] toArray()
注:其中的 Iterator iterator()方法会返回一个Iterator对象,用来遍历集合。而foreach其实是Iterable中的一个方法,用来遍历集合
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
在Java8之后还新增了Stream操作集合,因为用到的还比较少,这里就先不做总结。
2 Iterable
Iterable是Java集合框架中最顶级的接口,但是它的子接口只有Collection一个,当时在阅读源码的时候就很奇怪为什么不把它的方法直接合并到Collection中,或者直接继承Iterator。。。
Api:
修饰符和返回值 | 方法名 | 描述 |
---|---|---|
Iterator | iterator() | 返回一个内部元素为T类型的迭代器 |
default void | forEach(Consumer<? super T> action) | 对内部元素进行遍历,并对元素进行指定的操作 |
default Spliterator | spliterator() | 创建并返回一个可分割迭代器 |
Iterator接口的核心方法next()或者hasNext()是依赖于迭代器的当前迭代位置的。
如果Collection直接继承Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
多个迭代器是互不干扰的。
3 Iterator
Iterator是Java集合框架中主要用于迭代访问Collection集合中的元素,即迭代器。
注意:但是在使用Iterator访问Collection中的元素时,Collection中的元素不能被改变,只能通过remove()方法删除上一次next()方法返回的集合元素才可以。
图片从转载https://blog.youkuaiyun.com/u010887744/article/details/50575735