1. 程式人生 > >一點一點看原始碼(1)未完

一點一點看原始碼(1)未完

一:Collection體系概覽

容器的儲存,資料的獲取,資料新增,資料遍歷,資料搜尋,其他(判空,替換,排序,溢位,併發,同步,拆分,匯聚)

  @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

集合作為容器,其體系中的所有集合都包括了:

  大小(size),判空(isEmpty),新增元素(add),刪除元素(remove),是否包含(contains)

  轉換陣列(toArray),清空(clear),遍歷與迭代(forEach(父介面中),iterator)

  是否相同(equals),雜湊(hashCode),求交集(retainAll)

  除此之外,提供了java8的分離介面,聚合介面,為了大容量集合的多執行緒操作

二:map

“A map cannot contain duplicate keys; each key can map to at most one value.”
一個map不能包含重複的key,每個key最多對映一個value。
“This interface takes the place of the <tt>Dictionary</tt> class”Dictionary類是用來儲存鍵值對的類與map類似。

"The <tt>Map</tt> interface provides three <i>collection views</i>, which allow a map's contents to be viewed as a set of keys, collection of values, or set of key-value mappings.  The <i>order</i> of a map is defined as the order in which the iterators on the map's collection views return their elements.  Some map implementations, like the <tt>TreeMap</tt> class, make specific guarantees as to their order; others, like the <tt>HashMap</tt> class, do not."Map介面提供三個集合檢視,1.key的集合 2.value的集合 3.key-value的集合。map內元素的順序取決於Iterator的具體實現,獲取集合檢視其實是獲取一個迭代器,實現對遍歷元素細節的隱藏。TreeMap類能保證遍歷元素的順序,而HashMap就無法保證遍歷元素的順序。map是根據hashCode和equals方法決定存放的位置的.

 

三:set

原始碼中寫到:“A collection that contains no duplicate elements”  不能有重複元素

           “and at most one null element.”並且最多隻有一個空元素。

  @see Collection  @see List  @see SortedSet  @see HashSet  @see TreeSet  @see AbstractSet

1:Set集合與List一樣,都是繼承自Collection介面,常用的實現類有HashSet和TreeSet。值得注意的是,HashSet是通過HashMap來實現的而TreeSet是通過TreeMap來實現的,所以HashSet和TreeSet都沒有自己的資料結構,具體可以歸納如下:
    Set集合中的元素不能重複,即元素唯一
    HashSet按元素的雜湊值儲存,所以是無序的,並且最多允許一個null物件
    TreeSet按元素的大小儲存,所以是有序的,並且不允許null物件
    Set集合沒有get方法,所以只能通過迭代器(Iterator)來遍歷元素,不能隨機訪問
2:HashSet:

註解的大概摘要:

“This class implements the <tt>Set</tt> interface, backed by a hash table (actually a <tt>HashMap</tt> instance).”

HashSet是由HashMap實現的,

“Thus, it's very important not to set the initial capacity too high (or the load factor too low)” 初始化數量不要太高或低,

“Note that this implementation is not synchronized”不是執行緒安全的,如果多個執行緒操作,

“This is typically accomplished by synchronizing on some object that naturally encapsulates the set”
通過自然地封裝該集合的某個物件上進行同步來完成,如果實在不行就:“Set s = Collections.synchronizedSet(new HashSet(...))”  沒看明白這個操作,
public class HashSet<E>  extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{
    static final long serialVersionUID = -5024744406713321676L;
    private transient HashMap<E,Object> map;//用transient關鍵字標記的成員變數不參與序列化過程
    private static final Object PRESENT = new Object();

未完  待續。。。