面嚮對象語言對事物的體現都是以對象的形式,因此爲了方便對多個對象的操做,就對對象進行存儲,集合就是存儲對象最經常使用的一種方式。數組
數組雖然也能夠存儲對象,但長度是固定的;集合長度是可變的,數組中能夠存儲基本數據類型,集合只能存儲對象。安全
集合類的特色:集合只用於存儲對象,集合長度是可變的,集合能夠存儲不一樣類型的對象。數據結構
上述類圖中,實線邊框的是實現類,好比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。工具
抽象類的使用。若是要本身實現一個集合類,去實現那些抽象的接口會很是麻煩,工做量很大。這個時候就可使用抽象類,這些抽象類中給咱們提供了許多現成的實現,咱們只須要根據本身的需求重寫一些方法或者添加一些方法就能夠實現本身須要的集合類,工做流昂大大下降。性能
二、Collection (集合的最大接口)繼承關係spa
——List 能夠存放重複的內容線程
——Set 不能存放重複的內容,因此的重複內容靠hashCode()和equals()兩個方法區分3d
——Queue 隊列接口
——SortedSet 能夠對集合中的數據進行排序
Collection定義了集合框架的共性功能。
add方法的參數類型是Object。以便於接收任意類型對象。
集合中存儲的都是對象的引用(地址)。
三、List的經常使用子類
特有方法。凡是能夠操做角標的方法都是該體系特有的方法。
——ArrayList 線程不安全,查詢速度快
——Vector 線程安全,但速度慢,已被ArrayList替代
——LinkedList 鏈表結果,增刪速度快
四、Set接口
Set:元素是無序(存入和取出的順序不必定一致),元素不能夠重複。
——HashSet:底層數據結構是哈希表。是線程不安全的。不一樣步。
HashSet是如何保證元素惟一性的呢?
是經過元素的兩個方法,hashCode和equals來完成。
若是元素的HashCode值相同,纔會判斷equals是否爲true。
若是元素的hashcode值不一樣,不會調用equals。
注意,對於判斷元素是否存在,以及刪除等操做,依賴的方法是元素的hashcode和equals方法。
——TreeSet:
有序的存放:TreeSet 線程不安全,能夠對Set集合中的元素進行排序
經過compareTo或者compare方法來保證元素的惟一性,元素以二叉樹的形式存放。
五、Object類
在實際開發中常常會碰到區分同一對象的問題,一個完整的類最好覆寫Object類的hashCode()、equals()、toString()三個方法。
六、集合的輸出
——4種常見的輸出方式
——Iterator: 迭代輸出,使用最多的輸出方式
——ListIterator: Iterator的子接口,專門用於輸出List中的內容
——Enumeration
——foreach
在迭代時,不能夠經過集合對象的方法操做集合中的元素,由於會發生ConcurrentModificationException異常。因此,在迭代器時,只能用迭代器的放過操做元素,但是Iterator方法是有限的,只能對元素進行判斷,取出,刪除的操做,若是想要其餘的操做如添加,修改等,就須要使用其子接口,ListIterator。該接口只能經過List集合的listIterator方法獲取。
七、Map接口
Correction、Set、List接口都屬於單值的操做,而Map中的每一個元素都使用key——>value的形式存儲在集合中。
Map集合:該集合存儲鍵值對。一對一對往裏存。並且要保證鍵的惟一性。
八、Map接口的經常使用子類
Map
——HashMap:底層是哈希表數據結構,容許使用 null 值和 null 鍵,該集合是不一樣步的。將hashtable替代,jdk1.2.效率高。
——TreeMap:底層是二叉樹數據結構。線程不一樣步。能夠用於給map集合中的鍵進行排序。
九、集合工具類
Collections:集合框架的工具類。裏面定義的都是靜態方法。
Collections和Collection有什麼區別?
Collection是集合框架中的一個頂層接口,它裏面定義了單列集合的共性方法。
它有兩個經常使用的子接口,
——List:對元素都有定義索引。有序的。能夠重複元素。
——Set:不能夠重複元素。無序。
Collections是集合框架中的一個工具類。該類中的方法都是靜態的。
提供的方法中有能夠對list集合進行排序,二分查找等方法。
一般經常使用的集合都是線程不安全的。由於要提升效率。
若是多線程操做這些集合時,能夠經過該工具類中的同步方法,將線程不安全的集合,轉換成安全的。
是否有序 | 是否容許元素重複 | ||
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!