Java基礎系列(三十九):集合之Collection
阿新 • • 發佈:2018-12-01
Collection
是在前文中已經介紹過了,他是兩種集合型別之一的父介面,首先我們來看一下它的框架結構
框架圖
可以看出,作為頂級的框架,Collection
僅僅是繼承了Iterable
介面,接下來,我們來看一下Iterable
的原始碼,看看有什麼收穫。
public interface Iterable<T> {
Iterator<T> iterator();
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);
}
}
可以看到這個介面中有三個方法,其中iterator()
方法可以給我們提供一個迭代器,這個在之前的教程就已經說過了,而forEach()
方法提供了一個函式式介面的引數,我們可以使用lambda
Collection<String> collection = ...;
collection.forEach(String s -> System.out.println(s));
這樣就可以獲取到每個值,它的底層實現是加強for
迴圈,實際上也是迭代器去遍歷,因為編譯器會把加強for
迴圈編譯為迭代遍歷。
Spliterator()
是1.8
新加的方法,字面意思可分割的迭代器,不同以往的iterator()
需要順序迭代,Spliterator()
可以分割為若干個小的迭代器進行並行操作,既可以實現多執行緒操作提高效率,又可以避免普通迭代器的fail-fast
fail-fast
機制是java
集合中的一種錯誤機制。當多個執行緒對同一個集合的內容進行操作時,就可能會產生fail-fast
事件)機制所帶來的異常。Spliterator()
可以配合1.8
新加的Stream()
進行並行流的實現,大大提高處理效率。具體的使用方法會在講解Stream()
的時候進行講解。
Collection原始碼
接下來,我們來看一下Collection的原始碼,
public interface Collection<E> extends Iterable<E> {
//1
int size();
//2
boolean isEmpty();
//3
boolean contains(Object o);
//4
Iterator<E> iterator();
//5
Object[] toArray();
//6
<T> T[] toArray(T[] a);
//7
boolean add(E e);
//8
boolean remove(Object o);
//9
boolean containsAll(Collection<?> c);
//10
boolean addAll(Collection<? extends E> c);
//11
boolean removeAll(Collection<?> c);
//12
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;
}
//13
boolean retainAll(Collection<?> c);
//14
void clear();
//15
boolean equals(Object o);
//16
int hashCode();
//17
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
//18
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
//19
default Stream<E> `parallelStream`() {
return StreamSupport.stream(spliterator(), true);
}
}
可以看到,Collection()
中提供了19個介面方法。接下來,我們來了解一下這些方法的作用:
size()
,返回當前儲存在集合中的元素個數。isEmpty()
,如果集合中沒有元素,返回true。contains(Object obj)
,如果集合中包含了一個與obj相等的物件,返回true。iterator()
,返回這個集合的迭代器。toArray()
,返回這個集合的物件陣列toArray(T[] arrayToFill)
,返回這個集合的物件陣列,如果arrayToFill足夠大,就將集合中的元素填入這個陣列中。剩餘空間填補null;否則,分配一個新陣列,其成員型別與arrayToFill的成員型別相同,其長度等於集合的大小,並填充集合元素。add(Object element)
,將一個元素新增到集合中,如果由於這個呼叫改變了集合,返回true。remove(Object obj)
,從集合中刪除等於obj的物件,如果有匹配的物件被刪除,返回true。containsAll(Collection<?> other)
,如果這個集合包含other集合中的所有元素,返回true。addAll(Collection<? extends E> other)
,將other集合中的所有元素新增到這個集合,如果由於這個呼叫改變了集合,返回true。removeAll(Collection<?> other)
,從這個集合中刪除other集合中存在的所有元素。如果由於這個呼叫改變了集合,返回true。removeIf(Predicate<? super E> filter)
,從這個集合刪除filter返回true的所有元素,如果由於這個呼叫改變了集合,則返回true。retainAll(Collection<?> other)
,從這個集合中刪除所有與other集合中的元素不同的元素。如果由於這個呼叫改變了集合,返回true。clear()
,從這個集合中刪除所有的元素。equals(Object o)
,如果兩個集合物件相等返回true。hashCode()
,返回該集合物件的雜湊值。spliterator()
,返回分割後的若干個小的迭代器。stream()
,返回這個集合對於的流物件。parallelStream()
,返回這個集合的並行流物件。
可以看到,作為第一級的集合介面,Collection
提供了一些基礎操作(增,刪),並且可以通過實現Iterable
介面獲取一個迭代器去遍歷獲取集合中的元素。
下節預告
下節我們來講AbstractCollction
這個類,作為Collection的第一級子類,它又給我們提供了什麼作用呢?