JDK 集合 Collection
一、繼承關係圖
二、介面方法說明
Collection介面繼承自Iterable介面,它是集合樹的最頂層節點,它總共定義了15個方法:
//返回集合中元素的個數
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);
//只保留指定集合中包含的元素
boolean retainAll(Collection<?> c);
//移除集合中所有的元素
void clear();
//將集合與指定物件進行比較
boolean equals(Object o);
//返回集合的hashcode值
int hashCode();
三、重點繼承實現子類
* @author Josh Bloch * @author Neal Gafter * @see Set * @see List * @see Map * @see SortedSet * @see SortedMap * @see HashSet * @see TreeSet * @see ArrayList * @see LinkedList* @see Vector * @see Collections * @see Arrays * @see AbstractCollection * @since 1.2
四、原始碼分析
1 public interface Collection<E> extends Iterable<E> { 2 // Query Operations 原註釋,不明意義 3 4 //定義size方法,應返回size大小,最大值為Integer.MAX_VALUE 5 int size(); 6 7 //定義isEmpty方法,用於返回是否為空 8 boolean isEmpty(); 9 10 //定義contains方法,判斷一個obj是否屬於此集合 11 boolean contains(Object o); 12 13 //定義迭代器方法,返回一個迭代器物件 14 Iterator<E> iterator(); 15 16 //定義轉換為轉換Obj陣列的方法,返回一個obj陣列 17 Object[] toArray(); 18 19 //定義轉換為泛型T陣列的方法,返回一個指定泛型的陣列 20 <T> T[] toArray(T[] a); 21 22 //定義add方法,新增一個元素e,並返回新增成功標誌 23 boolean add(E e); 24 25 //定義remove方法,移除一個元素obj,並返回移除元素成功標誌 26 boolean remove(Object o); 27 28 //定義containsAll方法,判斷是否包含集合例項物件c 29 boolean containsAll(Collection<?> c); 30 31 //定義addAll方法,新增集合例項物件c到本例項中 32 boolean addAll(Collection<? extends E> c); 33 34 //定義removeAll方法,從本例項中移除集合實力物件c 35 boolean removeAll(Collection<?> c); 36 37 38 /** 39 * jdk8新增 40 * 大意為: 41 * 定義removeIf方法,該方傳遞引數為函式式,傳遞內容是一個介面型別,該介面型別 42 * 定義為一個filter函式,該函式用於傳遞給Objects.requireNonNull判斷,然後呼叫 43 * 迭代器,將滿足該定義的filter的本例項中的元素移除 44 * @since 1.8 45 */ 46 default boolean removeIf(Predicate<? super E> filter) { 47 Objects.requireNonNull(filter); 48 boolean removed = false; 49 final Iterator<E> each = iterator(); 50 while (each.hasNext()) { 51 if (filter.test(each.next())) { 52 each.remove(); 53 removed = true; 54 } 55 } 56 return removed; 57 } 58 59 //定義retainAll方法,取本例與集合例項c的交集,判斷交集元素數量是否大於0 60 boolean retainAll(Collection<?> c); 61 62 //定義clear方法,清除本例集合中的所有元素 63 void clear(); 64 65 // Comparison and hashing 原註釋,不明意義 66 67 //不解釋 68 boolean equals(Object o); 69 70 //定義hashCode方法,獲取hashCode標記的方法 71 int hashCode(); 72 73 /** 74 *jdk8新增 75 *大意為: 76 *將迭代器拆分,重寫自Iterable介面,從已知元素數量的本例中返回拆分後的迭代器 77 *此方法返回的為本類本身 78 *子類可能重寫迭代器拆分,將一個集合的迭代拆分為多個集合的迭代交由多個執行緒 79 * @since 1.8 80 */ 81 @Override//重寫父類 82 default Spliterator<E> spliterator() { 83 return Spliterators.spliterator(this, 0); 84 } 85 86 /** 87 * jdk8新增 88 * 大意為: 89 * 將預設的迭代器拆分後的結果,聚合為流,該流並非io中的流, 90 * 是一種類似於資料排序操作流 91 * @since 1.8 92 */ 93 default Stream<E> stream() { 94 return StreamSupport.stream(spliterator(), false); 95 } 96 97 /** 98 * jdk8新增 99 * 同上,但是具體其他的實現中,因為可並行,所以可能是執行緒不安全的 100 * 101 * @since 1.8 102 */ 103 default Stream<E> parallelStream() { 104 return StreamSupport.stream(spliterator(), true); 105 }
public interface Iterable<T> { //定義iterator方法,返回迭代器 Iterator<T> iterator(); /** * jdk8新增 * 大意為: * 根據action呼叫Objects.requireNonNull進行過濾 * 過濾結果呼叫for迴圈取出, * @since 1.8 */ default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } } /** * jdk8新增 * 大意為: * 分離迭代器,將未知大小的迭代器進行拆分,返回拆分的迭代器本身 * * @since 1.8 */ default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); } }
五、Collection是所有集合的基類,因此介面中抽象的操作都是集合的共性操作
集合作為容器,其體系中的所有集合都包括了:
大小(size),判空(isEmpty),新增元素(add),刪除元素(remove),是否包含(contains)
轉換陣列(toArray),清空(clear),遍歷與迭代(forEach(父介面中),iterator)
是否相同(equals),雜湊(hashCode),求交集(retainAll)
除此之外,提供了java8的分離介面,聚合介面,為了大容量集合的多執行緒操作