集合框架源码分析一(接口篇)
一。Iterable接口?
public interface Iterable<T> {
? ? /**
? ? ?* 實現此接口的所有集合都可以使用foreach循環
? ? ?* 由于Collection接口擴展自Iterable接口,
? ? ?* 標準類庫的任何集合都可以使用"for each"循環
? ? ?* @return an Iterator.
? ? ?*/
? ? Iterator<T> iterator();
}
二。interface Iterator<E>?
public interface Iterator<E> {
? ? /**
? ? ?* 返回true如果迭代還有更多的元素
? ? ?* 換而言之,如果調用next()方法返回一個元素而不是拋出一個異常則返回true
? ? ?*/
? ? boolean hasNext();
? ? /**
? ? ?* 返回迭代器中的下一個元素
? ? ?* 如果迭代器中沒有更多的元素則拋出NoSuchElementException
? ? ?*/
? ? E next();
? ? /**
? ? ?* remove方法將移除上一次調用next方法時返回的元素,如果想移除特定位置的元素
? ? ?* 需要先逃過該元素
? ? ?*
? ? ?* 如果沒有調用next方法就調用remove方法將拋出IllegalStateException
? ? ?*/
? ? void remove();
}
三。interface Collection<E>?
public interface Collection<E> extends Iterable<E> {
? ? /**
? ? ?* 返回集合元素的個數,如果集合有元素超過Integer.MAX_VALUE
? ? ?* 返回Integer.MAX_VALUE
? ? ?*/
? ? int size();
? ? /**
? ? ?* 如果集合不含元素則返回true
? ? ?* @return <tt>true</tt> if this collection contains no elements
? ? ?*/
? ? boolean isEmpty();
? ? /**
? ? ?* 如果集合中含有參數o則返回true。
? ? ?* 正常來說返回結果如下,
? ? ?* 當且僅當集合中至少有一個元素e
? ? ?* o==null ? e==null : o.equals(e)
? ? ?* o的類型與集合元素類型不相容則拋出ClassCastException
? ? ?* 如果o為null,并且集合不允許空值則拋出NullPointerException
? ? ?*/
? ? boolean contains(Object o);
? ? /**
? ? ?*
? ? ?* 返回集合元素的迭代器。
? ? ?*/
? ? Iterator<E> iterator();
? ? /**
? ? ?* 返回一個對象數組,包含集合中的所有元素
? ? ?* 即使知道集合所包含的具體的數據類型也不能進行
? ? ?* 強制類型轉換
? ? ?* 比如:String[] values = (String[])collect.toArray; ?//錯誤
? ? ?* 可遍歷時一一轉換
? ? ?*
? ? ?*/
? ? Object[] toArray();
? ? /**
? ? ?* 返回一個數組,包含集合中的所有元素?
? ? ?* 數組元素的類型為指定數組類型
? ? ?*
? ? ?* 檢查數組參數是否大于集合的容量。如果大于的話,便將該集合所有元素添加到數組
? ? ?* 中,并加上一個null結束符。如果等于集合長度,則將集合所有元素復制到數組但不
? ? ?* 添加null。如果小于的話,則以給定數組參數的類型新建一個數組,并將該集合各個
? ? ?* 元素填入數組。創建數組方法為
? ? ?* Array.newInstance(a.getClass().getComponentType(), size);
? ? ?*/
? ? <T> T[] toArray(T[] a);
? ? /**
? ? ?* 將一個指定的元素添加到集合中,如果集合發生了改變則返回true。
? ? ?* 特殊的,一些集合拒接添加null,一些集合不會添加相同的元素,
? ? ?* 一些特殊類型的元素也不能添加到有些集合
? ? ?*
? ? ?* 如果集合不支持此方法則拋出UnsupportedOperationException
? ? ?* 如果指定元素類型阻止其被添加入集合則拋出ClassCastException
? ? ?* 如果指定元素為空,并且集合不支持添加null元素則拋出NullPointerException
? ? ?* 如果指定元素的一些特性拒絕其被加入集合則拋出IllegalArgumentException
? ? ?* 如果由于插入限制使e不能被添加則拋出IllegalStateException,在并發操作時可能
? ? ?* 會拋出此異常
? ? ?*/
? ? boolean add(E e);
? ? /**
? ? ?* 如果o在集合中存在,則刪除此元素
? ? ?* 如果有元素被移除,則返回true
? ? ?*
? ? ?* 如果指定元素類型與集合元素類型不兼容則拋出ClassCastException
? ? ?* 如果指定元素為空,并且集合不支持添加null元素則拋出NullPointerException
? ? ?* 如果集合不支持此方法則拋出UnsupportedOperationException
? ? ?*/
? ? boolean remove(Object o);
? ? /**
? ? ?* 如果集合包含指定集合c中的所有元素則返回true
? ? ?*
? ? ?* 如果c中一個或多個元素類型與集合元素類型不相容則拋出ClassCastException
? ? ?* 如果如果指定集合c中包含一個或多個null元素,并且集合不支持添加null
? ? ?* 或者如果指定的集合c為null則拋出NullPointerException
? ? ?*/
? ? boolean containsAll(Collection<?> c);
? ? /**
? ? ?* 把指定集合c中所有元素添加到集合中
? ? ?* 如果在添加元素過程中c已經被修改了,則稱此操作是undefined,會拋出異常
? ? ?*
? ? ?* 如果集合不支持此方法則拋出UnsupportedOperationException
? ? ?* 如果指定集合元素類型阻止其被添加入集合則拋出ClassCastException
? ? ?* 如果如果指定集合c中包含一個或多個null元素,并且集合不支持添加null
? ? ?* 或者如果指定的集合c為null則拋出NullPointerException
? ? ?* 如果指定集合元素的一些特性拒絕其被加入集合則拋出IllegalArgumentException
? ? ?* 如果由于插入限制,指定集合中有一部分元素沒有被添加到集合中則拋出
? ? ?* IllegalStateException,并發操作時可能發生
? ? ?*/
? ? boolean addAll(Collection<? extends E> c);
? ? /**
? ? ?* 移除既包含在本集合中也包含在指定集合c中的所有元素
? ? ?* 如果集合發生改變則返回true
? ? ?*?
? ? ?* 如果集合不支持此方法則拋出UnsupportedOperationException
? ? ?* 如果集合中元素類型與給定集合c元素類型不相容則拋出ClassCastException
? ? ?* 如果如果指定集合c中包含一個或多個null元素,并且集合不支持null
? ? ?* 或者如果指定的集合c為null則拋出NullPointerException
? ? ?*/
? ? boolean removeAll(Collection<?> c);
? ? /**
? ? ?* 移除集合中所有不包含在指定集合c中的元素
? ? ?*?
? ? ?* 如果集合不支持此方法則拋出UnsupportedOperationException
? ? ?* 如果集合中元素類型與給定集合c元素類型不相容則拋出ClassCastException
? ? ?* 如果指定集合c中包含一個或多個null元素,并且集合不支持null
? ? ?* 或者如果指定的集合c為null則拋出NullPointerException
? ? ?*/
? ? boolean retainAll(Collection<?> c);
? ? /**
? ? ?* 移除集合中所有元素,此方法返回后isEmpty() = true
? ? ?*
? ? ?* 如果集合不支持此方法則拋出UnsupportedOperationException
? ? ?*/
? ? void clear();
? ? /**
? ? ?* 重寫Object euqals方法
? ? ?*
? ? ?* 不同的集合equals方法不同
? ? ?*/
? ? boolean equals(Object o);
? ? /**
? ? ?* 重寫equals方法,也需要重寫hashCode方法
? ? ?*/
? ? int hashCode();
}
四。interface List<E>?
public interface List<E> extends Collection<E> {
? ? /**
? ? ?* 同Collection接口
? ? ?*/
? ? int size();
? ? /**
? ? ?* 同Collection接口
? ? ?*/
? ? boolean isEmpty();
? ? /**
? ? ?* 同Collection接口
? ? ?*/
? ? boolean contains(Object o);
? ? /**
? ? ?* 返回列表或隊列的迭代器
? ? ?*/
? ? Iterator<E> iterator();
? ? /**
? ? ?* 同Collection接口
? ? ?*/
? ? Object[] toArray();
? ? /**
? ? ?* 同Collection接口
? ? ? * 示例: String[] y = x.toArray(new String[0])
? ? ?* 如果指定數組類型與list元素類型不相容則拋出ArrayStoreException
? ? ?* 如果指定數組a為null則拋出NullPointerException
? ? ?*/
? ? <T> T[] toArray(T[] a);
? ? // Modification Operations
? ? /**
? ? ?* 將一個元素添加到list的最后
? ? ? * 其他同Collection接口
? ? ?*/
? ? boolean add(E e);
? ? /**
? ? ?* 如果指定對象o在集合中存在,則移除它,如果存在多個o則移除第一個
? ? ?* 其他同Collection接口
? ? ?*/
? ? boolean remove(Object o);
? ? /**
? ? ?* 如果集合中包含指定集合c中的所有元素則返回true
? ? ?* 其他同Collection接口
? ? ?*/
? ? boolean containsAll(Collection<?> c);
? ? /**
? ? ?* 同Collection接口
? ? ?*/
? ? boolean addAll(Collection<? extends E> c);
? ? /**
? ? ?* 在給定位置index插入指定集合c的第一個元素,然后依次插入后面的元素
? ? ? * 當在添加過程中指定集合c發生改變時,則認為此操作是undefined,將拋出異常
? ? ? *
? ? ?* 如果此集合不支持此方法則拋出UnsupportedOperationException
? ? ?* 如果指定集合元素的類型阻止其被加入List則拋出ClassCastException
? ? ?* 如果指定集合包含一個或多個null元素,并且List不允許null元素,或集合c為空
? ? ? * ? ? ? ? ? ? 則拋出NullPointerException
? ? ?* 如果集合c的一些元素特性阻止其被添加入List拋出IllegalArgumentException
? ? ?* 如果index<0 || index>size() 則拋出IndexOutOfBoundsException
? ? ?*/
? ? boolean addAll(int index, Collection<? extends E> c);
? ? /**
? ? ?* 同Collection接口
? ? ?*/
? ? boolean removeAll(Collection<?> c);
? ? /**
? ? ?* 同Collection接口
? ? ?*/
? ? boolean retainAll(Collection<?> c);
? ? /**
? ? ?* 同Collection接口
? ? ?*/
? ? void clear();
? ? /**
? ? ?* 重寫Object的equals方法。
? ? ? * o與List相等的原則為:
? ? ? * 首先Obejct對象要是一個List,即實現了List接口
? ? ? * 其次2個集合在同樣的位置包含同樣的元素?
? ? ?*/
? ? boolean equals(Object o);
? ? /**
? ? ?* 重寫equals方法必須重寫hashCode方法
? ? ? * List hashCode的計算公式為:
? ? ? * int hashCode = 1;
? ? ?* ?Iterator<E> i = list.iterator();
? ? ?* ?while (i.hasNext()) {
? ? ?* ? ? ?E obj = i.next();
? ? ?* ? ? ?hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode());
? ? ?* ?}
? ? ?*/
? ? int hashCode();
? ? // Positional Access Operations
? ? /**
? ? ?* 返回List中指定位置的元素
? ? ? * 如果index<0 || index>size() 則拋出IndexOutOfBoundsException
? ? ?*/
? ? E get(int index);
? ? /**
? ? ?* 用element替換List中指定位置的元素
? ? ? *
? ? ?* 如果List,比如Set,不支持此操作則拋出UnsupportedOperationException
? ? ?* 如果element類型使其不能被添加則拋出ClassCastException
? ? ?* 如果給定的參數E為空并且List不允許空元素則拋出NullPointerException
? ? ?* 如果index<0 || index>size() 則拋出IndexOutOfBoundsException
? ? ?*/
? ? E set(int index, E element);
? ? /**
? ? ?* 在指定位置插入一個元素element,并把隨后的元素向右移
? ? ? * 異常拋出同上面的set方法
? ? ?*/
? ? void add(int index, E element);
? ? /**
? ? ?* 移除List指定位置的元素,并把隨后的元素向左移
? ? ?*/
? ? E remove(int index);
? ? // Search Operations
? ? /**
? ? ?* 如果List中含有與O相等的元素,則返回第一個的位置
? ? ? * 否則返回-1表示集合中不含此元素
? ? ? *
? ? ?* 如果o對象類型與List元素類型不相容則拋出ClassCastException
? ? ?* 如果給定的參數E為空并且List不允許空元素則拋出NullPointerException
? ? ?*/
? ? int indexOf(Object o);
? ? /**
? ? ?* 如果List中含有與O相等的元素,則返回最后一個的位置
? ? ? * 否則返回-1表示集合中不含此元素
? ? ?*/
? ? int lastIndexOf(Object o);
? ? // List Iterators
? ? /**
? ? ?* 返回一個listIterator
? ? ?* 特點:適用于對List進行遍歷,包含一個add(E e)方法,在遍歷時可在指定位置
? ? ? * 添加元素,包含previous()方法,hasPrevious()方法用于反向遍歷
? ? ? * 下面將具體講解listIterator接口
? ? ?*/
? ? ListIterator<E> listIterator();
? ? /**
? ? ?* 返回一個listIterator,在指定的位置開始迭代
? ? ? * 如果index<0 || index>size() 則拋出IndexOutOfBoundsException
? ? ?*/
? ? ListIterator<E> listIterator(int index);
? ? // View
? ? /**
? ? ?* 獲取List的子范圍,子范圍包含fromIndex但不包含toIndex
? ? ?* 你可以將任何操作作用于子范圍,并且它們能夠自動反應到List的情況
? ? ? * 比如:l.subList(10,19).clear(),子范圍的各個元素將自動從l中刪除。
? ? ?*/
? ? List<E> subList(int fromIndex, int toIndex);
}
五。interface ListIterator<E>?
public interface ListIterator<E> extends Iterator<E> {
? ? // Query Operations
? ? /**
? ? ?* 正向遍歷時,如果迭代器還有更多的元素則返回true?
? ? ?* 換而言之,如果調用next()方法返回一個元素而不是拋出一個異常則返回true
? ? ?*
? ? ?*/
? ? boolean hasNext();
? ? /**
? ? ?* 返回List的下一個元素,當遍歷List時此方法將被反復調用,
? ? ?* 也可以與previous方法混合調用?
? ? ?* 如果迭代器沒有下一個元素則拋出NoSuchElementException
? ? ?*/
? ? E next();
? ? /**
? ? ?* 反方向遍歷時,如果迭代器含有更多的元素則返回true
? ? ?* 換而言之,如果調用previous方法返回一個元素而不是拋出一個異常則返回true
? ? ?*/
? ? boolean hasPrevious();
? ? /**
? ? ?* 返回List的前一個元素,當反向遍歷時此方法將被反復調用,
? ? ?* 也可以與next方法混合調用?
? ? ?* 如果迭代器沒有上一個元素則拋出NoSuchElementException
? ? ?*/
? ? E previous();
? ? /**
? ? ?* 返回下次調用next()方法時返回的元素的索引,如果返回的是最后一個 ? ??
? ? ?* 元素則返回List的長度
? ? ?*/
? ? int nextIndex();
? ? /**
? ? ?* 返回下次調用previous()方法時返回的元素的索引,如果
? ? ?* 迭代器剛好越過第一個元素,位于集合最開始的位置則返回-1
? ? ?*/
? ? int previousIndex();
? ? // Modification Operations
? ? /**
? ? ?* 移除最近一次調用next或者previous方法時返回的元素
? ? ?* 在調用next或者previous方法后,此方法僅能被調用一次
? ? ? * 此方法僅能在沒有調用ListIterator.add時調用
? ? ? *
? ? ?* 如果List不支持此方法則拋出UnsupportedOperationException?
? ? ?* 如果next或者previous沒有被調用,或者next或previous已經被調用,
? ? ? * 但是同時已經調用了add或remove方法,再調用此方法時將拋出
? ? ? * IllegalStateException
? ? ?*/
? ? void remove();
? ? /**
? ? ?* 以一個新的元素取代上一次調用next或previous方法時返回的元素
? ? ?* 此方法僅能在調用next或previous方法后沒有調用ListIterator.remove
? ? ?* 或ListIterator.add情況下被調用
? ? ? *
? ? ?* 如果e類型與List元素類型不相容則拋出ClassCastException
? ? ?* 如果List不支持此方法則拋出UnsupportedOperationException
? ? ?* 如果元素的一些特性使其不能被添加入List則拋出IllegalArgumentException
? ? ?* 如果next或者previous沒有被調用,或者next或previous已經被調用,
? ? ? * 但是同時已經調用了add或remove方法,再調用此方法時將拋出
? ? ? * IllegalStateException
? ? ?*/
? ? void set(E e);
? ? /**
? ? ?* 將元素e插入到調用next方法返回的元素之后,或者調用previous方法返回的元素
? ? ?* 之前
? ? ? *
? ? ?* 如果e類型與List元素類型不相容則拋出ClassCastException
? ? ?* 如果List不支持此方法則拋出UnsupportedOperationException
? ? ?* 如果元素的一些特性使其不能被添加入List則拋出IllegalArgumentException
? ? ?*/
? ? void add(E e);
}
六。interface Set<E>?
public interface Set<E> extends Collection<E> {
? ? // Query Operations
? ? /**
? ? ?* 返回集合元素的個數,如果集合有元素超過Integer.MAX_VALUE
? ? ?* 返回Integer.MAX_VALUE
? ? ?*/
? ? int size();
? ? /**
? ? ?* 如果Set不包含元素則返回true
? ? ?*/
? ? boolean isEmpty();
? ? /**
? ? ?* 同List接口
? ? ?*/
? ? boolean contains(Object o);
? ? /**
? ? ?* 同List接口
? ? ? * 其返回數組的元素的位置不定
? ? ?*/
? ? Iterator<E> iterator();
? ? /**?
? ? ?* 同List接口
? ? ? * 其返回數組的元素的位置不定
? ? ?*/
? ? <T> T[] toArray(T[] a);
? ? // Modification Operations
? ? /**
? ? ?* 如果Set中已經含有此元素,Set不改變并且返回false
? ? ?* 此規定確保Set中不含有重復的元素 ?
? ? ?*
? ? ?* 拋出異常同List接口 ? ??
? ? ?*/
? ? boolean add(E e);
? ? /**
? ? ?* 如果集合中存在此元素o則移除此元素
? ? ?*/
? ? boolean remove(Object o);
? ? // Bulk Operations
? ? /**
? ? ?* 如果Set中含有所有c中的元素,則返回true
? ? ?*/
? ? boolean containsAll(Collection<?> c);
? ? /**
? ? ?* 把知道集合c中的所有除了在Set中已經存在的元素添加到Set中
? ? ? * 如果c也是一個Set則是求2個集合的并集
? ? ? * 如果在添加元素的過程中發現C已經被修改了,則此操作是undefined
? ? ?*/?
? ? boolean addAll(Collection<? extends E> c);
? ? /**
? ? ?* 移除集合中所有不包含在指定集合c中的元素
? ? ? * 如果c也是一個Set則是求2個集合的差集
? ? ?*/
? ? boolean retainAll(Collection<?> c);
? ? /**
? ? ?* 移除所有既包含在c中也包含在Set中的元素
? ? ?*/
? ? boolean removeAll(Collection<?> c);
? ? /**
? ? ?* 移除Set中所有元素,此方法返回后isEmpty()=true
? ? ?*/
? ? void clear();
? ? // Comparison and hashing
? ? /**
? ? ?* Set中的equals方法
? ? ? * 當且僅當滿足以下條件時返回true:
? ? ?* 首先o是一個Set,即實現了Set接口
? ? ? * 其次兩個Set長度相等并且o中所有元素都包含在Set中,Set中的所有元素也都包含
? ? ? * 在o中
? ? ?*/
? ? boolean equals(Object o);
? ? /**
? ? ?* 重寫equals方法需要重寫hashCode方法
? ? ? * Set的hashCode值為所有元素的hashCode值之和,如果元素為null,hashCode
? ? ?* 為0
? ? ?*/
? ? int hashCode();
}
七。interface Queue<E>
?public interface Queue<E> extends Collection<E> {
? ? /**
? ? ?* 如果queue中有足夠的容量,向queue中添加一個元素
? ? ? *
? ? ?* 如果queue中沒有足夠的容量則拋出IllegalStateException
? ? ?* 如果e的類型使其不能被添加入queue則拋出ClassCastException
? ? ?* 如果指定元素為null并且queue不支持null元素則拋出NullPointerException
? ? ?* 如果e的某些特征使其不能被添加入queue則拋出IllegalArgumentException
? ? ?*/
? ? boolean add(E e);
? ? /**
? ? ?* 如果queue中有足夠的容量,向queue中添加一個元素
? ? ? * 對于一個用大小限制的queue,此方法更加合適
? ? ?*/
? ? boolean offer(E e);
? ? /**
? ? ?* 移除頭節點并返回。
? ? ? * 當queue為空時拋出NoSuchElementException
? ? ?*/
? ? E remove();
? ? /**
? ? ?* 移除頭節點并返回
? ? ? * 當queue為空時返回null
? ? ?*/
? ? E poll();
? ? /**
? ? ?* 獲取頭節點并返回
? ? ? * 當queue為空時拋出NoSuchElementException
? ? ?*/
? ? E element();
? ? /**
? ? ?* 獲取頭節點并返回
? ? ? * 當queue為空時返回null
? ? ?*/
? ? E peek();
}
八。interface SortedSet<E>?
public interface SortedSet<E> extends Set<E> {
? ? /**
? ? ?* comparator用于對集合元素進行排序,
? ? ?* 如果Set使用自然順序排列其元素,則返回null
? ? ?*/
? ? Comparator<? super E> comparator();
? ? /**
? ? ?* 返回一個從fromElement(包含)到toElement(不包含)的子范圍
? ? ?* 如果fromElement與toElement相等則返回的Set是空集
? ? ?* 子范圍支持Set的所有操作,并且對子范圍的操作將影響到Set
? ? ?*
? ? ?* 如果使用Set的comparator,fromElement和toElement不能進行互相比較
? ? ?* fromElement或toElement的類型與Set元素類型不相容則拋出ClassCastException
? ? ?* 如果fromElement或toElement為null,并且Set不支持null元素則拋出空指針異常
? ? ?* 如果fromElement比toElement大,這個大是使用comparator比較的結果,
? ? ?* 或者Set限制只能訪問某范圍,而fromElement或toElement位于此范圍之外則
? ? ?* 拋出IllegalArgumentException
? ? ?*/
? ? SortedSet<E> subSet(E fromElement, E toElement);
? ? /**
? ? ?* 返回Set中使用比較器或自然順序,元素大小嚴格小于toElement的元素集
? ? ?* 同樣子范圍支持Set的所有操作,并會反映到集合
? ? ?* 異常拋出同上
? ? ?*/
? ? SortedSet<E> headSet(E toElement);
? ? /**
? ? ?* 返回Set中使用比較器或自然順序,元素大小大于等于fromElement的元素集
? ? ?* 同樣子范圍支持Set的所有操作,并會反映到集合
? ? ?* 異常拋出同上
? ? ?*/
? ? SortedSet<E> tailSet(E fromElement);
? ? /**
? ? ?* 返回集合的第一個元素,即最小元素
? ? ?* 如果集合為空則拋出NoSuchElementException
? ? ?*/
? ? E first();
? ? /**
? ? ?* 返回集合最后一個元素,即最大元素
? ? ?* 如果集合為空則拋出NoSuchElementException
? ? ?*/
? ? E last();
}
九。interface Map<K,V>?
public interface Map<K,V> {
? ? // Query Operations
? ? /**
? ? ?* 返回map中key-value映像的個數
? ? ?* 如果map中元素個數超過Integer.MAX_VALUE,返回Integer.MAX_VALUE
? ? ?*/
? ? int size();
? ? /**
? ? ?* 如果map中不含key-value映像則返回true
? ? ?*/
? ? boolean isEmpty();
? ? /**
? ? ?* 如果Map中含有一個映射的key值等于給定key則返回true
? ? ?*
? ? ?* 如果給定key值的類型與Map不相容則拋出ClassCastException
? ? ?* 如果給定key為null,并且Map不允許null key則拋出NullPointerException
? ? ?*/
? ? boolean containsKey(Object key);
? ? /**
? ? ?* map中key值唯一,但value值可能相同,
? ? ?* 如果有一個或多個value與指定value值相等則返回true
? ? ?* 同樣可能拋出ClassCastException和NullPointerException異常
? ? ?*/
? ? boolean containsValue(Object value);
? ? /**
? ? ?* 返回與此key值對應的value值,如果map中不含此key則返回null
? ? ?* 這里有一個問題,如果map支持null value,那么返回null無法判斷map中是否含有此
? ? ?* key值,這里可以用containsKey方法來判斷
? ? ?* 同樣可能拋出ClassCastException和NullPointerException異常
? ? ?*/
? ? V get(Object key);
? ? // Modification Operations
? ? /**
? ? ?* 向map中添加一鍵值對。如果map中已經含有此key值,則替換原來的value為
? ? ?* 給定的value值,判斷是否含有key值可使用m.containsKey方法,此方法返回true則
? ? ?* key值已經存在,返回false則不存在。
? ? ?* 如果m.containsKey返回true,則put方法返回原來的value,否則返回null
? ? ?*
? ? ?* 如果map不支持此方法則拋出UnsupportedOperationException
? ? ?* 如果給定key或value值類型阻止其被存入map則拋出ClassCastException
? ? ?* 如果給定key或value為null,并且map允許null key或null value則拋出
? ? ?* ? ? ? ? ? ? ? ? ? ? ? ? ? NullPointerException
? ? ?* 如果給定key或value的某屬性使其不能被存入map則拋出IllegalArgumentException
? ? ?*/
? ? V put(K key, V value);
? ? /**
? ? ?* 根據給定key值移除鍵值對,
? ? ?* 返回移除的鍵值對的value值,如果key值不存在返回null.
? ? ?* 如果map支持null value,那么返回null無法判斷map中是否含有此
? ? ?* key值,這里可以用containsKey方法來判斷
? ? ?*/
? ? V remove(Object key);
? ? // Bulk Operations
? ? /**
? ? ?* 將m中所有鍵值對添加到Map,
? ? ?* 此方法等同于在循環中一組一組的添加鍵值對
? ? ?* 如果在添加過程中發現m已經被修改,則稱此操作時undefined,可能拋出異常
? ? ?*/
? ? void putAll(Map<? extends K, ? extends V> m);
? ? /**
? ? ?* 移除map中所有鍵值對,此方法返回時isEmpty() = true
? ? ?*/
? ? void clear();
? ? // Views
? ? /**
? ? ?* 返回映射表中所有鍵的視圖集
? ? ?* 對map的修改回反應到Set當中,相反,對Set中key進行移除操作,比如
? ? ?* Iterator.remove,Set.remove ,removeAll,retainAll,clear等操作時被移除的鍵
? ? ?* 和它相關聯的值也將從map中被移除,但是此Set不支持任何添加操作
? ? ?* 如果在遍歷Set時,發現map已經被修改,則稱遍歷的結果是undefined
? ? ?*/
? ? Set<K> keySet();
? ? /**
? ? ?* 返回映射表中所有值的視圖集。
? ? ?* 其他特性同上
? ? ?*?
? ? ?*/
? ? Collection<V> values();
? ? /**
? ? ?* 返回Map.entry對象的視圖集,即映射表中的鍵值對.
? ? ?* 你可以從該集合中移除有關元素,同時,這些元素也將從映射表中被移除
? ? ?* 但你不能向其中添加任何元素
? ? ?* 可以獲取Set<Map.Entry<K, V>>的迭代器來遍歷map
? ? ?*/
? ? Set<Map.Entry<K, V>> entrySet();
? ? /**
? ? ?* 此接口是映射表的入口(鍵值對)。entrySet方法返回一個map的集合視圖,此視圖的
? ? ?* 元素就是Entry<K,V>,只能通過視圖的iterator獲取一個map entry的引用
? ? ?*/
? ? interface Entry<K,V> {
? ? /**
* 返回Entry中存儲的key值
? ? ? ? ?* 如果遍歷Set<Map.Entry<K, V>>時發現此entry已經被移除則拋出IllegalStateException
*/
K getKey();
? ? /**
* 返回Entry中存儲的value值
? ? ? ? ?* 如果遍歷Set<Map.Entry<K, V>>時發現此entry已經被移除則拋出IllegalStateException
*/
V getValue();
? ? /**
* 用給定的value替換此entry對應的value值,如果此鍵值對已經被移除
? ? ? ? ?* 則此方法的調用是undefined,此方法返回的是上一個value
? ? ? ? ?*
? ? ? ? ?* 如果此value的類型阻止其被存入map則拋出ClassCastException
? ? ? ? ?* 如果指定value值為null,并且map不允許null值則拋出NullPointerException
? ? ? ? ?* 如果指定value的一些屬性阻止其被存入map則拋出IllegalArgumentException
? ? ? ? ?* 如果遍歷Set<Map.Entry<K, V>>時發現此entry已經被移除則拋出IllegalStateException
? ? ? ? ?*/
V setValue(V value);
/**
* 比較兩個entry是否相等
? ? ? ? ?* 比較的原則是:
? ? ? ? ?* 首先o是否是一個Map.entry對象
? ? ? ? ?* 其次此entry是否對應同一個映射,即鍵key和value是否相等
? ? ? ? ?*/
boolean equals(Object o);
/**
* 重新equals方法需要重新hashCode方法。
? ? ? ? ?* Entry的hashCode值的計算方法為:
? ? ? ? ?* ?(e.getKey()==null ? ? 0 : e.getKey().hashCode()) ^
* ?(e.getValue()==null ? 0 : e.getValue().hashCode())
? ? ? ? ?* 即key的hashCode與value的hashCode按位相與
*/
int hashCode();
? ? }
? ? // Comparison and hashing
? ? /**
? ? ?* 比較兩個Map是否相等
? ? ?* 比較原則:
? ? ?* 首先o是否是一個Map,即是否實現Map接口
? ? ?* 其次Map是否含有相同的鍵值對,因為map是無序的所以對位置無要求
? ? ?* 更加正式的來說m1.entrySet().equals(m2.entrySet())返回true則此方法返回true
? ? ?*/
? ? boolean equals(Object o);
? ? /**
? ? ?* 返回Map的hashCode值
? ? ?* 計算公式:
? ? ?* 為map.entrySet返回的集合的各個entry元素的hashCode之和
? ? ?*/
? ? int hashCode();
}
十。interface SortedMap<K,V>?
public interface SortedMap<K,V> extends Map<K,V> {
? ? /**
? ? ?* 返回一個比較器用于比較key值大小,
? ? ?* 如果key使用自然順序排列則返回null
? ? ?*/
? ? Comparator<? super K> comparator();
? ? /**
? ? ?* 返回一個從fromKey(包含)到toKey(不包含)的子范圍
? ? ?* 如果fromKey與toKey相等則返回的Map是空集
? ? ?* 子范圍支持Map的所有操作,并且對子范圍的操作將影響到Set
? ? ?*
? ? ?* 如果使用Map的comparator,fromKey和toKey不能進行互相比較
? ? ?* fromKey或toKey的類型與Set元素類型不相容則拋出ClassCastException
? ? ?* 如果fromKey或toKey為null,并且Set不支持null元素則拋出空指針異常
? ? ?* 如果fromKey比toKey大,這個大是使用comparator比較的結果,
? ? ?* 或者Set限制只能訪問某范圍,而fromKey或toKey位于此范圍之外則
? ? ?* 拋出IllegalArgumentException
? ? ?*
? ? ?*/
? ? SortedMap<K,V> subMap(K fromKey, K toKey);
? ? /**
? ? ?* 返回Map中使用比較器或自然順序,元素大小嚴格小于toKey的元素集
? ? ?* 同樣子范圍支持Map的所有操作,并會反映到集合
? ? ?* 異常拋出同上
? ? ?*/
? ? SortedMap<K,V> headMap(K toKey);
? ? /**
? ? ?* 返回Map中使用比較器或自然順序,元素大小大于等于fromKey的元素集
? ? ?* 同樣子范圍支持Map的所有操作,并會反映到集合
? ? ?* 異常拋出同上
? ? ?*/
? ? SortedMap<K,V> tailMap(K fromKey);
? ? /**
? ? ?* 返回集合的第一個元素,即最小元素
? ? ?* 如果集合為空則拋出NoSuchElementException
? ? ?*/
? ? K firstKey();
? ? /**
? ? ?* 返回集合的第最后一個元素,即最大元素
? ? ?* 如果集合為空則拋出NoSuchElementException
? ? ?*/
? ? K lastKey();
? ? /**
? ? ?* 返回包含在Map中的所有的key的子視圖,
? ? ?* 用set的iterator返回的key是按升序排列的,其他屬性與Map的keySet方法類似
? ? ?*/
? ? Set<K> keySet();
? ? /**
? ? ?* 返回包含在Map中的所有的value的子視圖,
? ? ?* 用Collection的iterator返回的value是按升序排列的,與key是一致的
? ? ?* 其他屬性與Map的values方法類似
? ? ?*/
? ? Collection<V> values();
? ? /**
? ? ?* 返回Map中鍵值對的視圖,
? ? ?* Set的iterator返回的元素是鍵遞增的。
? ? ?* 其他屬性同Map的entrySet方法
? ? ?*/
? ? Set<Map.Entry<K, V>> entrySet();
}
十二。雙端隊列Deque?
/**
?*?
?* 雙端隊列,一個線性集合,負責在隊列兩端插入和移除元素.
?*/
public interface Deque<E> extends Queue<E> {
? ? /**
? ? ?*?
? ? ?* 將指定元素插入到雙端隊列的開頭(如果這樣做不違反容量限制)
? ? ?* 如果隊列有容量限制,使用offerFirst方法會更好,因為
? ? ?* offerFirst在插入元素失敗時返回一個null而不是拋出一個異常終止程序
? ? ?*/
? ? void addFirst(E e);
? ? /**
? ? ?* ?將指定元素插入到雙端隊列的結尾(如果這樣做不違反容量限制)
? ? ?* ?如果隊列有容量限制,請使用offerLast方法
? ? ?*/
? ? void addLast(E e);
? ? boolean offerFirst(E e);
? ? boolean offerLast(E e);
? ? /**
? ? ?*?
? ? ?* 移除雙端隊列的第一個元素,此方法在隊列為空時
? ? ?* 將拋出一個異常
? ? ?*/
? ? E removeFirst();
? ? /**
? ? ?* 移除雙端隊列的最后一個元素,此方法在隊列為空時
? ? ?* 將拋出一個異常
? ? ?*/
? ? E removeLast();
? ? /**
? ? ?* 移除雙端隊列的第一個元素,此方法在隊列為空時
? ? ?* 將返回null
? ? ?*/
? ? E pollFirst();
? ? /**
? ? ?* 移除雙端隊列最后一個元素,此方法在隊列為空時
? ? ?* 將返回null
? ? ?*/
? ? E pollLast();
? ? /**
? ? ?* 獲取雙端隊列的第一個元素,此方法在隊列為空時
? ? ?* 將拋出一個異常
? ? ?*/
? ? E getFirst();
? ? /**
? ? ?* 獲取雙端隊列的最后一個元素,此方法在隊列為空時
? ? ?* 將拋出一個異常
? ? ?*/
? ? E getLast();
? ? /**
? ? ?* 獲取雙端隊列的第一個元素,此方法在隊列為空時
? ? ?* 將返回null
? ? ?*/
? ? E peekFirst();
? ? /**
? ? ?* 獲取雙端隊列的最后一個元素,此方法在隊列為空時
? ? ?* 將返回null
? ? ?*/
? ? E peekLast();
? ? /**
? ? ?*?
? ? ?* ?找到o在隊列中第一次出現的位置,并移除它
? ? ?* ?如果隊列不包含此元素,do nothing
? ? ?*/
? ? boolean removeFirstOccurrence(Object o);
? ? /**
? ? ?*?
? ? ?* 找到o在隊列中最后一次出現的位置,并移除它
? ? ?*/
? ? boolean removeLastOccurrence(Object o);
? ??
? ??
? ? // *** 下面是隊列queue的一些方法 ***
? ? /**
? ? ?*?
? ? ?* 向雙端隊列 尾部添加一個元素,同addLast
? ? ?*/
? ? boolean add(E e);
? ? /**
? ? ?* 向雙端隊列 尾部添加一個元素,同offerLast
? ? ?*/
? ? boolean offer(E e);
? ? /**
? ? ?* 移除雙端隊列第一個元素,同removeFirst
? ? ?*/
? ? E remove();
? ? /**
? ? ?* ?移除雙端隊列第一個元素,同pollFirst
? ? ?*/
? ? E poll();
? ? /**
? ? ?* 獲取雙端隊列第一個元素,同getFirst
? ? ?*/
? ? E element();
? ? /**
? ? ?* 獲取雙端隊列第一個元素,同peekFirst
? ? ?*/
? ? E peek();
? ? // *** 下面是棧的一些方法 ***
? ? /**
? ? ?* 向雙端隊列頭部添加一個元素,同addFirst
? ? ?*/
? ? void push(E e);
? ? /**
? ? ?* 移除雙端隊列第一個元素,并返回它,同removeFirst
? ? ?*/
? ? E pop();
? ? // *** 集合的一些方法 ***
? ? /**
? ? ?* 從此雙端隊列中移除第一次出現的指定元素。如果此雙端隊列不包含該元素,則不作更改
? ? ?*/
? ? boolean remove(Object o);
? ? /**
? ? ?* 如果雙端隊列包含此元素則返回true
? ? ?*/
? ? boolean contains(Object o);
? ? /**
? ? ?* 隊列元素個數
? ? ?*/
? ? public int size();
? ? /**
? ? ?* 返回雙端隊列的迭代器
? ? ?*/
? ? Iterator<E> iterator();
? ? /**
? ? ?* 返回一個逆序遍歷的迭代器
? ? ?*/
? ? Iterator<E> descendingIterator();
}
總結
以上是生活随笔為你收集整理的集合框架源码分析一(接口篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用动态数组模拟双向循环链表
- 下一篇: 集合框架源码分析——抽象类