對於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查看引用,如下圖
我們可以看到下面三個接口繼承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剩余的方法。好,明天繼續學習。
