对于java的集合类,首先看张图
这张图大致描绘出了java集合类的总览,两个体系,一个Collection集合体系一个Map集合体系。在说集合类之前,先说说Iterable这个接口,这个接口在jdk1.8之前,里面只有一个方法Iterator iterator(),即返回一个T类型的迭代器,在1.8增加了两个default修饰的方法
default void forEach(Consumer super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
这都是为了实现java函数式编程而加进去的方法,具体使用在这篇里面先不说,以后专门弄一篇来说这个。还有一个接口Iterator,里面包含两个方法boolean hasNext()以及E next(),这两个方法一个用来判断集合有没有下一个元素,一个用来取出下一个元素。同样Iterator里有两个default方法,先跳过。Iterable接口的作用是,如果一个类实现了这个接口,或者它实现得接口继承了这个接口,那么它就可以用增强for循环来循环获得集合中的元素(虽然其实也是用了迭代器);Iterator接口的作用是,如果一个类或它的父类实现了这个接口,那么就可以显式地用迭代器的hasNext()和next()来循环取值。下面我们来看看Collection接口:
public interface Collection extends Iterable {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator iterator();
Object[] toArray();
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 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 spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
}
抛开default方法,剩下的15个方法就是Collection集合系的最基本方法,将在它的实现类里面加以实现,这些方法的名称对应作用都很明显,就不细讲了,值得注意的是,这个接口继承了Iterable接口,里面有个Iterator iterator();方法,这意味着Collection集合系的实现类都可以用增强for循环来取值。在eclipse里Collection接口按F4查看引用,如下图
我们可以看到下面三个接口继承Collection接口(BeanContext不是java.util包下的,忽略),List,Queue和Set,以及一些实现类。这三个接口和图上的对应起来,我们一一来查看。先看List接口,它首先有Collection接口里的所有方法(不包含Collection的default方法),然后有几个自己的方法,需要注意的是里面有个listIterator方法,这个玩意也是个迭代器,不过比起Iterator,这玩意多了几个功能,其实相当于Iterator的一个扩展:
public interface ListIterator extends Iterator {
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剩余的方法。好,明天继续学习。