Java基礎-->集合框架

第一節   集合框架的概述

一、概述:
1、簡述:
      所謂集合,就是爲方便對多個對象的操作,對對象進行存儲。集合就是存儲對象最常用的一種方式。
2、集合與數組的區別:
      數組:可存儲同種類型的數據,但長度固定,也可存儲基本類型的數據
      集合:只可存儲對象,長度可變,類型可以不同。
3、集合的特點:
      只用於存儲對象,長度可變,也可存不同類型的對象。
      集合是一個接口,將每種容器的共性提取,形成的一個體系。
4、數據結構:
      由於每種容器對數據的存儲方式都各不相同,所以出現了不同的容器。此種存儲方式稱之爲數據結構。

二、集合體系如圖:

三、集合中的共性方法:
下面從增刪改查等方面對這些共性發方法進行簡單介紹:
說明:
   a.add方法中的參數類型是Object,以便於接收任意類型的對象
    b.集合中存儲的都是對象的引用(即地址)。
1、增加:
   add(Object obj);   ----->  添加元素

2、刪除:
   remove();      ----->  刪除集合中指定參數的元素
   removeAll();   ----->  刪除當前集合中與另一集合相同的元素,即只保留與另一集合不同的元素
   clear();       ----->  清空集合中的元素,集合還存在

3、獲取集合長度:
   size();        ----->  獲取集合長度,即集合元素的個數

4、修改:
   set(int index,e);  ----->  將指定位置(index)上的元素修改爲給定的參數e

5、判斷:
   boolean contains(e); ----->  判斷給定元素e是否存在於集合中

6、迭代器:iterator()   ----->  集合取出元素的方式
   boolean hasNext();   ----->  判斷是否還有下一個元素
   next();              ----->  取出下一個元素


示例:


四、Collection接口包含的子類
Collection接口包含List與Set等子類
List:元素是有序的,元素可重複,因該集合體繫有索引
Set:元素是無序的,元素不可重複


第二節   List集合
一、概述:
List集合包含三個子類:ArrayList、LinkedList以及Vector等。
具體區別如下:
1、ArrayList:底層的數據結構時數組結構
      特點:查詢速度很快,因爲有索引(角標),但增刪速度稍慢。是線程不同步的。
2、LinkedList:底層使用的是鏈表數據結構
      特點:增刪速度很快,但查詢速度稍慢,因爲每一個元素都鏈接到前一元素。
3、Vector:底層是數組結構,JDK1.0出現,比較老。
      特點:增刪查詢都很慢,被ArrayList替代了,線程是同步的。


二、對於List集合特有的方法:

凡是可操作角標的方法都是該體系特有的方法,基本方法和Collection中的一樣。
1、增加:
   add(int index,e);               ----->  在指定位置增加給定的元素
   addAll(int index,Collection);   ----->  在指定位置增加給定集合中的所有元素,若省略位置參數,則在當前集合的後面依次添加元素

2、刪除:
   remove(int index); ----->  刪除集合中指定位置上的元素
   
3、修改:
   set(int index,e);  ----->  將指定位置(index)上的元素修改爲給定的參數e

4、查詢
   get(int index);    ----->  獲取指定位置上的元素
   indexOf(e);        ----->  通過指定元素獲取其在集合中的位置
   subList(int from,int to);    ----->  獲取從from到to位置上的元素
   Iterator listIterator();     ----->  返回Iterator接口類型值


注:
1、listIterator是List特有的迭代器,是Iterator子接口。在迭代時,不可通過集合對象的方法操作集合中的元素,因爲會發生ConcurrentModficationException異常。所以,在迭代時,只能用迭代器的方法操作,可Iterator方法是有限的,若想要其他操作如增刪改寫等,就需要使用子接口,即ListIterator,該接口只能通過List集合的listIerator方法獲取。
2、在迭代時,循環中的next()調用一次,就要對hasNext判斷一次,不可判斷一次調用兩次。
3、List集合判斷元素是否相同,一句的是元素的equals方法,其中,contains中就是調用的equals方法。
arraylist實現iterator原碼解釋:


三、Vector類:
Vector中有種特殊的取出方式,即爲枚舉
1、枚舉和迭代器十分相似,其實兩者是一樣的,由於枚舉的名稱以及方法名都過長,因此,就被迭代器取代了。這裏就不過多的介紹了。


四、LinkedList類特有方法:
一)JDK1.6之前的方法
1、增加:
   addFirst(obj);   ----->  在集合頭部添加給定的元素
   addLast(obj);    ----->  在集合尾部添加給定的元素

2、獲取:
   getFirst();   ----->  獲取集合第一個元素,若集合中沒有元素,則出現NoSuchElementException
   getLast();    ----->  獲取集合最後一個元素,若集合中沒有元素,則出現NoSuchElementException
   
3、刪除
   removeFirst();  ----->  獲取並刪除集合第一個元素,若集合中沒有元素,則出現NoSuchElementException
   removeLast();   ----->  獲取並刪除集合最後一個元素,若集合中沒有元素,則出現NoSuchElementException

二)JDK1.6出現的替代方法:
1、增加:
   offerFirst(obj);   ----->  在集合頭部添加給定的元素
   offerLast(obj);    ----->  在集合尾部添加給定的元素

2、獲取:
   peekFirst();   ----->  獲取集合第一個元素,若集合中沒有元素,則返回null
   peekLast();    ----->  獲取集合最後一個元素,若集合中沒有元素,則返回null
   
3、刪除
   pollFirst();  ----->  獲取並刪除集合第一個元素 ,若集合中沒有元素,則返回null
   pollLast();   ----->  獲取並刪除集合最後一個元素,若集合中沒有元素,則返回nul

arraylist實現iterator原碼解釋

三、Vector類:
Vector中有種特殊的取出方式,即爲枚舉
1、枚舉和迭代器十分相似,其實兩者是一樣的,由於枚舉的名稱以及方法名都過長,因此,就被迭代器取代了。這裏就不過多的介紹了。

四、LinkedList類特有方法:
一)JDK1.6之前的方法
1、增加:
   addFirst(obj);   ----->  在集合頭部添加給定的元素
   addLast(obj);    ----->  在集合尾部添加給定的元素

2、獲取:
   getFirst();   ----->  獲取集合第一個元素,若集合中沒有元素,則出現NoSuchElementException
   getLast();    ----->  獲取集合最後一個元素,若集合中沒有元素,則出現NoSuchElementException
   
3、刪除
   removeFirst();  ----->  獲取並刪除集合第一個元素,若集合中沒有元素,則出現NoSuchElementException
   removeLast();   ----->  獲取並刪除集合最後一個元素,若集合中沒有元素,則出現NoSuchElementException

二)JDK1.6出現的替代方法:
1、增加:
   offerFirst(obj);   ----->  在集合頭部添加給定的元素
   offerLast(obj);    ----->  在集合尾部添加給定的元素

2、獲取:
   peekFirst();   ----->  獲取集合第一個元素,若集合中沒有元素,則返回null
   peekLast();    ----->  獲取集合最後一個元素,若集合中沒有元素,則返回null
   
3、刪除
   pollFirst();  ----->  獲取並刪除集合第一個元素 ,若集合中沒有元素,則返回null
   pollLast();   ----->  獲取並刪除集合最後一個元素,若集合中沒有元素,則返回nul



第三節  Set 集合
一、概述:
1、Set集合的特點:
1)集合中的元素師無需的(存入和取出的順序不一定一致),且元素不可重複。
2)Set集合的功能和Collection集合的是一樣的,並沒有什麼特別的方法。

這裏主要說一下關於HashSet和TreeSet兩種集合的方法和特點:

二、HashSet類
1、特點:
   底層數據結構時哈希表,且元素取出方式只有迭代器方法
2、哈希表簡介:
1)哈希表是按照哈希值的大小進行排列的,如果兩個哈希值不同,則大的值放後面;如果兩個哈希值相同,則再用equals方法比較兩個元素的對象是否相同,如果不同,則將第二個值順延,兩個值串起來,放在同一個位置上。
2)取值時是按照哈希值取出來的。
3)哈希值的取值方式:哈希值存入哈希表中,哈希表也稱散列表。散列表是存放記錄的數組。具體來說,散列表是根據散列函數H(Key)和處理衝突的方法將一組關鍵字映象到一個有限的連續的地址集(區間)上,並以關鍵字在地址集中的“象”,作爲這條記錄在表中的存儲位置,這種表表稱爲散列表,這一映象過程就稱爲散列造表或散列,所存儲位置稱爲散列地址(這是百度百科上的內容)。我的理解是:存入的對象的地址是通過提取其信息摘要,通過散列函數計算而獲得的一個關鍵碼(Key)即哈希值,然後將這個值存入哈希表,而哈希表的存值方式是按照哈希值的大小順序存儲的,並且在這個哈希表中有自己的索引,但是哈希表的取值方式並不是按照索引的方式取出的。取出方式是按照哈希表中特有的算法取出的哈希值(注意,現在說的是哈希值,不是元素的取出),這些算法有直接尋址法、摺疊法、平方取中法以及其他的一些方法等等。具體是按哪種算法查找的,我並不太清楚,所以,取出的哈希值可能就不是按照哈希值的大小順序取出的了。
3、HashSet如何保證元素的唯一性:

通過元素的兩個方法hasCode和equals方法來完成的。
如果元素的hashCode的值相同,纔會判斷equals是否爲true。如果元素的hashCode值不相同,就不會調用equals方法了。
注:對於判斷元素是否存在和刪除(或添加)。依賴的方法是元素的hashcode和equals方法。


HashSet常見方法:


三、TreeSet類:
1、特點:
1)底層的數據結構爲二叉樹結構(紅黑樹結構)
2)可對Set集合中的元素進行排序,是因爲:TreeSet類實現了Comparable接口,該接口強制讓增加到集合中的對象進行了比較,需要複寫compareTo方法,才能讓對象按指定需求(如人的年齡大小比較等)進行排序,並加入集合。
java中的很多類都具備比較性,其實就是實現了Comparable接口。
注意:排序時,當主要條件相同時,按次要條件排序。
3)二叉樹示意圖


2、保證元素唯一性的依據:
實現的compareTo方法的返回值,是正整數、負整數或零,則兩個對象較大、較小或相同。相等時則不會存入。
3、兩種比較方式:
      排序有兩個要素:元素和集合
1)第一種排序方式:自然排序
      讓元素自身具備比較性。元素需要實現Comparable接口,覆蓋compareTo方法,這種方式也稱爲元素的自然排序或默認排序方式。




2)第二種排序方式:比較器
      當元素自身不具備比較性是,或者具備比較性,卻不是所需要的,這時就需要讓集合自身具備比較性。在集合初始化時就有了比較方式(即參閱構造函數)。
當兩種排序方式都存在時,以比較器爲主。
      如何構造比較器:定義一個類,實現Comparator接口,覆蓋compare方法。
注:字符串本身具備比較性,但是它的比較方式可能不是所需要的,這時,就只能使用比較器了。



第四節  Map 集合
一、概述:
1、簡述:
      Map<K,V>集合是一個接口,和List集合及Set集合不同的是,它是雙列集合,並且可以給對象加上名字,即鍵(Key)
2、特點:
1)該集合存儲鍵值對,一對一對往裏存
2)要保證鍵的唯一性。
二、方法簡介:
Map集合中的方法和上面集合的方法是很相似的,這裏不一一都具體說明了,用示例的形式體現一下:
1、添加:      添加單個元素:put(k key,V value); 添加一個集合:putAll(Map<? extends K,? extends V> m)
2、刪除:      獲取並移除:remove(Object key); 清空集合中元素:clear (Object key)
3、判斷:      判斷集合是否爲空: isEmpty()  ; 鍵對應的值是否存在:containsKey(Object key); 值對應的鍵是否存在:containsValue(Object obj)  ---->     返回boolean類型
4、獲取:      獲取單個元素:get(Object key); 獲取長度:size();    獲取Map集合中的所有值(value),返回Conllection集合。
注:
a.也可以通過get()方法的返回值來判斷一個鍵是否存在,通過返回null來判斷。
b.其中put方法:如果出現添加相同的鍵,那麼後添加的值會覆蓋原有鍵對應的值,並且該方法返回被覆蓋的值即原值。
示例:


三、Map集合中的子類:
1、HashTable:特點 -- > 底層是哈希表數據結構,不可存入null鍵和null值。該集合是線程同步的,效率較低
2、HashMap:特點   -- >  底層是哈希表數據結構,允許使用null值和null鍵。該集合是線程同步的,效率較高
3、TreeMap:特點     -- > 底層是二叉樹數據結構,線程不同步,可以用於給Map集合中的鍵值進行排序,和Set很像,其實,Set集合的底層就是使用了Map集合。

四、兩種獲取集合元素的方法:
        重點說一下獲取方法中的兩個:keySet()和entrySet()方法
1、keySet()方法獲取元素
原理:將Map集合中的所有鍵存入到Set集合中,因爲Set集合具備迭代器,所以可以用迭代方式取出所有的鍵,再根據get方法獲取每一個鍵對應的值。簡單說就是:Map集合---->Set集合 ---->迭代器取出
示例:




2、entrySet()方法獲取元素:
原理:將Map集合中的映射關係存入到了Set集合中,而這個映射關係的數據類型是Map.Entry,在通過迭代器將映射關係存入到Map.Entry集合中,並通過其中的getKey()和getValue()放取出鍵值。
示例:


補充:關於Map.Entry
Map是一個接口,其實,Entry也是一個接口,它是Map的子接口中的一個內部接口,就相當於是類中有內部類一樣。爲何要定義在其內部呢?
原因:a.Map集合中村的是映射關係這樣的兩個數據,是先有Map這個集合,纔可有映射關係的存在,而且此類關係是集合的內部事務。
            b.並且這個映射關係可以直接訪問Map集合中的內部成員,所以定義在內部。
五、Map集合的應用及擴展:
1、何時使用Map集合:當量數據之間存在着映射關係的時候,就應該想到使用Map集合。
2、示例:
獲取該字符串中的字母出現的次數,如:"sjokafjoilnvoaxllvkasjdfns";希望打印的結果是:a(3)c(0).....
通過結果發現,每個字母都有對應的次數,說明字母和次數之間有映射關係。測試如下:



第二節   List集合
一、概述:
List集合包含三個子類:ArrayList、LinkedList以及Vector等。
具體區別如下:
1、ArrayList:底層的數據結構時數組結構
      特點:查詢速度很快,因爲有索引(角標),但增刪速度稍慢。是線程不同步的。
2、LinkedList:底層使用的是鏈表數據結構
      特點:增刪速度很快,但查詢速度稍慢,因爲每一個元素都鏈接到前一元素。
3、Vector:底層是數組結構,JDK1.0出現,比較老。
      特點:增刪查詢都很慢,被ArrayList替代了,線程是同步的。

二、對於List集合特有的方法:
三、Vector類:
Vector中有種特殊的取出方式,即爲枚舉
1、枚舉和迭代器十分相似,其實兩者是一樣的,由於枚舉的名稱以及方法名都過長,因此,就被迭代器取代了。這裏就不過多的介紹了。

四、LinkedList類特有方法:
一)JDK1.6之前的方法
1、增加:
   addFirst(obj);   ----->  在集合頭部添加給定的元素
   addLast(obj);    ----->  在集合尾部添加給定的元素

2、獲取:
   getFirst();   ----->  獲取集合第一個元素,若集合中沒有元素,則出現NoSuchElementException
   getLast();    ----->  獲取集合最後一個元素,若集合中沒有元素,則出現NoSuchElementException
   
3、刪除
   removeFirst();  ----->  獲取並刪除集合第一個元素,若集合中沒有元素,則出現NoSuchElementException
   removeLast();   ----->  獲取並刪除集合最後一個元素,若集合中沒有元素,則出現NoSuchElementException

二)JDK1.6出現的替代方法:
1、增加:
   offerFirst(obj);   ----->  在集合頭部添加給定的元素
   offerLast(obj);    ----->  在集合尾部添加給定的元素

2、獲取:
   peekFirst();   ----->  獲取集合第一個元素,若集合中沒有元素,則返回null
   peekLast();    ----->  獲取集合最後一個元素,若集合中沒有元素,則返回null
   
3、刪除
   pollFirst();  ----->  獲取並刪除集合第一個元素 ,若集合中沒有元素,則返回null
   pollLast();   ----->  獲取並刪除集合最後一個元素,若集合中沒有元素,則返回nul
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章