java集合类源码学习一

时间:2021-07-27 17:03:59

 对于java的集合类,首先看张图

java集合类源码学习一

 

这张图大致描绘出了java集合类的总览,两个体系,一个Collection集合体系一个Map集合体系。在说集合类之前,先说说Iterable这个接口,这个接口在jdk1.8之前,里面只有一个方法Iterator<T> iterator(),即返回一个T类型的迭代器,在1.8增加了两个default修饰的方法

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);
}

 这都是为了实现java函数式编程而加进去的方法,具体使用在这篇里面先不说,以后专门弄一篇来说这个。还有一个接口Iterator<E>,里面包含两个方法boolean hasNext()以及E next(),这两个方法一个用来判断集合有没有下一个元素,一个用来取出下一个元素。同样Iterator里有两个default方法,先跳过。Iterable接口的作用是,如果一个类实现了这个接口,或者它实现得接口继承了这个接口,那么它就可以用增强for循环来循环获得集合中的元素(虽然其实也是用了迭代器);Iterator接口的作用是,如果一个类或它的父类实现了这个接口,那么就可以显式地用迭代器的hasNext()和next()来循环取值。下面我们来看看Collection接口:

public interface Collection<E> extends Iterable<E> {
int size();

boolean isEmpty();

boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();

<T> T[] toArray(T[] a);

boolean add(E e);

boolean remove(Object o);


boolean containsAll(Collection<?> c);

boolean addAll(Collection<? extends E> c);

boolean removeAll(Collection<?> c);

default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}

boolean retainAll(Collection<?> c);

void clear();

boolean equals(Object o);

int hashCode();

@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}

default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}

default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
}

 抛开default方法,剩下的15个方法就是Collection集合系的最基本方法,将在它的实现类里面加以实现,这些方法的名称对应作用都很明显,就不细讲了,值得注意的是,这个接口继承了Iterable<E>接口,里面有个Iterator<E> iterator();方法,这意味着Collection集合系的实现类都可以用增强for循环来取值。在eclipse里Collection接口按F4查看引用,如下图

java集合类源码学习一我们可以看到下面三个接口继承Collection接口(BeanContext不是java.util包下的,忽略),List,Queue和Set,以及一些实现类。这三个接口和图上的对应起来,我们一一来查看。先看List接口,它首先有Collection接口里的所有方法(不包含Collection的default方法),然后有几个自己的方法,需要注意的是里面有个listIterator方法,这个玩意也是个迭代器,不过比起Iterator,这玩意多了几个功能,其实相当于Iterator的一个扩展:

public interface ListIterator<E> extends Iterator<E> {

boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E e);
void add(E e);
}

 方法的意思也比较明朗,不过set方法是设置最后的值而add方法是往当前索引的前面加值。List有了这个迭代器,就可以任性取值了。同样地,看看Set接口和Queue接口,发现Set接口的方法基本和Collection里的一样,而Queue接口几乎完全不一样,除了add和remove方法,那么它应该是在子类或继承它的接口里去实现了Collection剩余的方法。好,明天继续学习。