Java--集合(一)
一、前序
前幾篇文章我結合數據結構說了一些常用的集合,但是我感覺那樣可能不系統,於是乎想著重寫,按照由整體到細節的方式去寫,這樣才能更好的把握集合,廢話不多說開始吧;
二、集合框架
上面這副圖是集合框架中的基本接口,另外還有NavigableSet和NavigableMap這兩個接口;看到這些接口如果你有些什麽想法的話,那麽恭喜你,你對Java集合掌握非常可以;這裏述說下每個接口的主要作用以及常用的一些方法,等等針對於單個接口的實現的時候我們到時候具體再說也可以;
1.Iterator接口:主要實現對集合進行叠代的叠代器;
2.基本接口:Collection和Map,這2個接口裏面封裝基本的集合操作,比如add,put,get等一系列方法,總體比較簡單;
3.List接口:有序集合,這裏面主要包括2種數據結構前面講的很清楚了,另外還有獲取元素的方法,叠代器,索引和隨機訪問,也就是上面的RandomAccess接口;
4.ListIterator接口:這個是Iterator接口的子接口,這個定義一個可以在叠代器以前增加元素的方法;
5.Set接口:Set接口等同於Collection接口,Set裏面add裏面不允許增加相同的元素;
Java裏面有個 很明顯的特點,就是不直接繼承接口,增加一層抽象類,然後在去實現抽象類,這樣有個好處就是方便我們對抽象類擴展,一但繼承接口那麽就必須對接口下面的所有方法進行實現,但是抽象類卻不需要;
以上簡單對接口的整體框架進行介紹,接下來我們開始對每一個具體的實現進行詳細介紹;
三、List接口
實現這個接口的集合主要有ArryList,Vector和LinkedList,前面介紹數據接口的鏈表的時候已經介紹過,這裏進行下對比;ArryList和Vector這兩個集合就要是基於動態數組實現的,區別就在Vector是線程同步的,每一個方法都是synchronized修飾,這個地方的好處就在於讀取的時候可以開2個線程同時訪問這個集合,建議是不同步的時候使用ArryList,同步的時候使用Vector,LinkedList主要是基於雙向鏈表實現,只要明白了數據結構相信這塊的東西很簡單,要是不明白的話可以看下我寫的鏈表那2章;這裏需要提一下LinkedList的叠代,LinkedList實現了ListIterator這個接口,可以用來遍歷集合;
四、Set接口
在明白這個之前我們先要了解一種數據結構--散列表(哈希表):
什麽是Hash?是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。
為什麽需要Hash?上面已經簡單提到出現Hash的目的,是為了快速查找到我們想要的數據,這個是針對於數組和鏈表結構的集合來說的,當我們需要查詢集合中是否於某個元素相同的時候我們需要便利整個集合,然而我們使用Hash可以減少我們的次數;這個我們舉個例子,好比我們在圖書管找我們需要的一本書,假設圖書管理員沒有進行分類整理的話,那麽我們需要在一堆亂七八糟的書堆裏查找我們需要的書,但是圖書管理進行分類以後我們只需要按照規則去我們需要的地方找我們需要的圖書就好,那麽在時間上我們就更加快速;
Hash函數?上面我們已經簡單提到了,Hash表的內部是按照某種規則進行分類排列,那麽接下來我們說一下常見的幾種函數:
1.直接定法址;
2.數字分析法;
3.平方取中法;
4.折疊法;
5.取模(求余數);----這種最常用,集合內部散列就是這樣實現的;
6.隨機數法;
基本上就是這幾種,應該都比較簡單,大家一看就明白;關鍵在於2點,計算簡單和分布均勻;
Hash沖突?上面簡單的說了一下Hash函數,我們考慮一下這個問題,就按照取模方法來說,肯定會有2個數字計算出的的余數相同,那麽針對這種情況我們怎麽辦,怎麽處理?這就是我們所說的沖突,接下來我們說一下處理沖突的手段:
1.開放定址法,這個是基於數組實現的,根據不同的處理方式我們可以分為線性探測法,二次探測法,隨機探測法,再散列函數法;這裏做一下概述:當發生沖突的時候我們需要存放沖突的數據,線性探測法和二次線性探測法這兩個方法主要是在自身的散列上存儲數據,線性探測的就是在沖突的位置繼續向下查找,直到找到為空的將數據存放,這一過程中難免會遇到已經有數據的位置,這種情況叫做聚集,影響效率,二次探測法就是將向尋址的結果平方,這樣就可以向前向後查找,另外二次探測法可以避免聚集,基本上只是散列表為填滿的時候,我們都可以使用上面2種方法解決沖突的問題;接下來就是在散列函數法,就是沖突的時候在增加一個散列表,重新計算地址然後將數據放入;
2.鏈地址法,這個居於鏈表和數組的實現,就是當出現沖突的時候繼續增加鏈表的節點,HashMap就是使用的這個方法;
明白Hash是什麽東西接下來我們開始看下Set接口下面的集合源碼,篇幅估計會比較大,我們在下一節說;
Java--集合(一)