1、概念
1、路徑:集合類存放於java.util包中。
2、存儲:集合類存放的都是對象的引用,而非對象本身,出於表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。另一面,就是集合不支持存放基本數據類型。
3、分類:集合類型主要有3種:list(列表)、set(集)和map(映射)。
列表,主要特徵:對象以線性方式存儲,無特定順序,只有一個開頭和一個結尾,當然,它與根本沒有順序的集是不同的。列表在數據結構中分別表現爲:數組和向量、鏈表、堆棧、隊列。
集(set),是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋裏放東西。對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重複對象(無序決定不能有重複對象)。集也有多種變體,可以實現排序等功能,如TreeSet,它把對象添加到集中的操作將變爲按照某種比較規則將其插入到有序的對象序列中。它實現的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。
映射與集或列表有明顯區別,映射中每個項都是成對的。映射中存儲的每個對象都有一個相關的關鍵字(Key)對象,關鍵字決定了 對象在映射中的存儲位置,檢索對象時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的。關鍵字本身並不能決定對象的存儲位置,它需要對過一種散列(hashing)技術來處理,產生一個被稱作散列碼(hash code)的整數值,散列碼通常用作一個偏置量,該偏置量是相對於分配給映射的內存區域起始位置的,由此確定關鍵字/對象對的存儲位置。理想情況 下,散列處理應該產生給定範圍內均勻分佈的值,而且每個關鍵字應得到不同的散列碼。
4、接口:集合接口分爲:Collection和Map,list、set實現了Collection接口
2、JAVA集合類
集合的兩個頂級接口分別爲:Collection和Map
2.1、Collection接口
Collection接口下有兩個比較常用的接口分別是List(列表)和Set(集),分別繼承與Collection接口,extends,其中List可以存儲重複元素,元素是有序的(存取順序一致),可以通過List腳標來獲取指定元素;而Set不可以有重複元素,元素是無序的。
第一、List接口
List接口中,比較常用的類有三個:ArrayList、Vactor、LinkedList,存放都是有序的。後者實現前者,implements;
1)Vector :線程安全的,多了一種取出元素的方式:枚舉(Enumeration),但已被ArrayList取代。適用於多線程中。
基於Array的List,其實就是封裝了Array所不具備的一些功能方便我們使用,它不可能走出Array的限制。性能也就不可能超越Array。所以,在可能的情況下,我們要多運用Array。另外很重要的一點就是Vector使用了“synchronized”,這個也是Vector和ArrayList的唯一的區別。
2)ArrayList :線程不安全的,對元素的查詢速度快。適用於查多,修改刪除少的場景。
同Vector一樣是一個基於數組實現的,但是不同的是ArrayList不是同步的。所以在性能上要比Vector優越一些,但是當運行到多線程環境中時,可需要自己在管理線程的同步問題。LinkedList:LinkedList不同於前面兩種List,它不是基於Array的,所以不受Array性能的限制。它每一個節點(Node)都包含兩方面的內容:1.節點本身的數據(data);2.下一個節點的信息(nextNode)。所以當對LinkedList做添加,刪除動作的時候就不用像基於Array的List一樣,必須進行大量的數據移動。只要更改nextNode的相關信息就可以實現了。這就是LinkedList的優勢。
3)LinkedList :線程不安全,基於鏈表結構,對元素的增刪速度很快。適用於查詢少,修改刪除較多的場景。
第二、Set接口
Set接口中,比較常用的類有兩個:HashSet、TreeSet:
1)HashSet:要保證元素唯一性,需要覆蓋掉Object中的equals和hashCode方法(因爲底層是通過這兩個方法來判斷兩個元素是否是同一個),是無序的。
2)TreeSet:以二叉樹的結構對元素進行存儲,可以對元素進行排序。
排序的兩種方式:
1、元素自身具備比較功能,元素實現Comparable接口,覆蓋compareTo方法。
2、建立一個比較器對象,該對象實現Comparator接口,覆蓋compare方法,並將該對象作爲參數傳給TreeSet的構造函數(可以用匿名內部類)。
2.2、Map接口
Map接口,其特點是:元素是成對出現的,以鍵和值的形式體現出來,鍵要保證唯一性:常用類有:HashMap,Hashtable ,TreeMap。
1)HashMap:線程不安全等的,允許存放null鍵null值。
2)Hashtable:線程安全的,不允許存放null鍵null值。
3)TreeMap:可以對鍵進行排序(要實現排序方法同TreeSet)。
Collection和Map兩個接口對元素操作的區別:
1、存入元素:
Collection接口下的實現類通過add方法來完成,而Map下是通過put方法來完成。
2、取出元素:
Collection接口下:List接口有兩種方式:1、get(腳標);2、通過Iterator迭代方式獲取元素;而Vactor多了一種枚舉(Enumeration)的方式。Set接口通過迭代的方式獲取元素。
Map接口下:先通地keySet獲取鍵的系列,然後通過該系列使用Iterator迭代方式獲取元素值。