java集合繼承關係
面嚮物件語言對事物的體現都是以物件的形式,所以為了方便對多個物件的操作,就對物件進行儲存,集合就是儲存物件最常用的一種方式。
陣列雖然也可以儲存物件,但長度是固定的;集合長度是可變的,陣列中可以儲存基本資料型別,集合只能儲存物件。
集合類的特點:集合只用於儲存物件,集合長度是可變的,集合可以儲存不同型別的物件。
上述類圖中,實線邊框的是實現類,比如ArrayList,LinkedList,HashMap等,折線邊框的是抽象類,比如AbstractCollection,AbstractList,AbstractMap等,而點線邊框的是介面,比如Collection,Iterator,List等。
1、Iterator介面
Iterator介面,這是一個用於遍歷集合中元素的介面,主要包含hashNext(),next(),remove()三種方法。它的一個子介面LinkedIterator在它的基礎上又添加了三種方法,分別是add(),previous(),hasPrevious()。也就是說如果是先Iterator介面,那麼在遍歷集合中元素的時候,只能往後遍歷,被遍歷後的元素不會在遍歷到,通常無序集合實現的都是這個介面,比如HashSet,HashMap;而那些元素有序的集合,實現的一般都是LinkedIterator介面,實現這個介面的集合可以雙向遍歷,既可以通過next()訪問下一個元素,又可以通過previous()訪問前一個元素,比如ArrayList。
抽象類的使用。如果要自己實現一個集合類,去實現那些抽象的介面會非常麻煩,工作量很大。這個時候就可以使用抽象類,這些抽象類中給我們提供了許多現成的實現,我們只需要根據自己的需求重寫一些方法或者新增一些方法就可以實現自己需要的集合類,工作流昂大大降低。
2、Collection (集合的最大介面)繼承關係
——List 可以存放重複的內容
——Set 不能存放重複的內容,所以的重複內容靠hashCode()和equals()兩個方法區分
——Queue 佇列介面
——SortedSet 可以對集合中的資料進行排序
Collection定義了集合框架的共性功能。
add方法的引數型別是Object。以便於接收任意型別物件。
集合中儲存的都是物件的引用(地址)。
3、List的常用子類
特有方法。凡是可以操作角標的方法都是該體系特有的方法。
——ArrayList 執行緒不安全,查詢速度快
——Vector 執行緒安全,但速度慢,已被ArrayList替代
——LinkedList 連結串列結果,增刪速度快
4、Set介面
Set:元素是無序(存入和取出的順序不一定一致),元素不可以重複。
——HashSet:底層資料結構是雜湊表。是執行緒不安全的。不同步。
HashSet是如何保證元素唯一性的呢?
是通過元素的兩個方法,hashCode和equals來完成。
如果元素的HashCode值相同,才會判斷equals是否為true。
如果元素的hashcode值不同,不會呼叫equals。
注意,對於判斷元素是否存在,以及刪除等操作,依賴的方法是元素的hashcode和equals方法。
——TreeSet:
有序的存放:TreeSet 執行緒不安全,可以對Set集合中的元素進行排序
通過compareTo或者compare方法來保證元素的唯一性,元素以二叉樹的形式存放。
5、Object類
在實際開發中經常會碰到區分同一物件的問題,一個完整的類最好覆寫Object類的hashCode()、equals()、toString()三個方法。
6、集合的輸出
——4種常見的輸出方式
——Iterator: 迭代輸出,使用最多的輸出方式
——ListIterator: Iterator的子介面,專門用於輸出List中的內容
——Enumeration
——foreach
在迭代時,不可以通過集合物件的方法操作集合中的元素,因為會發生ConcurrentModificationException異常。所以,在迭代器時,只能用迭代器的放過操作元素,可是Iterator方法是有限的,只能對元素進行判斷,取出,刪除的操作,如果想要其他的操作如新增,修改等,就需要使用其子介面,ListIterator。該介面只能通過List集合的listIterator方法獲取。
7、Map介面
Correction、Set、List介面都屬於單值的操作,而Map中的每個元素都使用key——>value的形式儲存在集合中。
Map集合:該集合儲存鍵值對。一對一對往裡存。而且要保證鍵的唯一性。
8、Map介面的常用子類
Map
——HashMap:底層是雜湊表資料結構,允許使用 null 值和 null 鍵,該集合是不同步的。將hashtable替代,jdk1.2.效率高。
——TreeMap:底層是二叉樹資料結構。執行緒不同步。可以用於給map集合中的鍵進行排序。
9、集合工具類
Collections:集合框架的工具類。裡面定義的都是靜態方法。
Collections和Collection有什麼區別?
Collection是集合框架中的一個頂層介面,它裡面定義了單列集合的共性方法。
它有兩個常用的子介面,
——List:對元素都有定義索引。有序的。可以重複元素。
——Set:不可以重複元素。無序。
Collections是集合框架中的一個工具類。該類中的方法都是靜態的。
提供的方法中有可以對list集合進行排序,二分查詢等方法。
通常常用的集合都是執行緒不安全的。因為要提高效率。
如果多執行緒操作這些集合時,可以通過該工具類中的同步方法,將執行緒不安全的集合,轉換成安全的。
10.比較
是否有序 | 是否允許元素重複 | ||
Collection | 否 | 是 | |
List | 是 | 是 | |
Set | AbstractSet | 否 | 否 |
HashSet | |||
TreeSet | 是(用二叉排序樹) | ||
Map | AbstractMap | 否 | 使用key-value來對映和儲存資料,key必須唯一,value可以重複 |
HashMap | |||
TreeMap | 是(用二叉排序樹) |
11.總結:
List:add/remove/get/set。
1,ArrayList:其實就是陣列,容量一大,頻繁增刪就是噩夢,適合隨機查詢;
2,LinkedList:增加了push/[pop|remove|pull],其實都是removeFirst;
3,Vector:歷史遺留產物,同步版的ArrayList,程式碼和ArrayList太像;
4,Stack:繼承自Vector。Java裡其實沒有純粹的Stack,可以自己實現,用組合的方式,封裝一下LinkedList即可;
5,Queue:本來是單獨的一類,不過在SUN的JDK裡就是用LinkedList來提供這個功能的,主要方法是offer/pull/peek,因此歸到這裡呢。
Set:add/remove。可以用迭代器或者轉換成list。
1,HashSet:內部採用HashMap實現的;
2,LinkedHashSet:採用LinkedHashMap實現;
3,TreeSet:TreeMap。
Map:put/get/remove。
1,HashMap/HashTable:散列表,和ArrayList一樣採用陣列實現,超過初始容量會對效能有損耗;
2,LinkedHashMap:繼承自HashMap,但通過重寫巢狀類HashMap.Entry實現了連結串列結構,同樣有容量的問題;
3,Properties:是繼承的HashTable。
順便說一下Arrays.asList,這個方法的實現依賴一個巢狀類,這個巢狀類也叫ArrayList!