天天看點

《黑馬程式員》java筆記->集合架構集合大總結

------- android教育訓練、java教育訓練、期待與您交流! ----------

1. Java集合架構概述

2.List接口以及實作類

3.Set接口以及實作類

4.Map接口以及實作類

5.Boxing/unBoxing

6.Iterator以及Enumeration接口

7.Collections和Arrays類

-------------------------------------

集合就是将若幹用途相同、近似的“資料”結合成一個整體。

集合從體系上分為三種:

(1) 清單(List):List集合區分元素的順序,允許包含相同的元素。

(2) 集(Set):Set集合不區分元素的順序,不允許包含相同的元素。

(3) 映射(Map):Map集合儲存的”鍵”-“值”對,“鍵”不能重複,而且一個“鍵”隻能對應一個“值”。

Java集合中隻能儲存引用資料類型,也就是儲存的是對象的位址,而非對象本身。集合中元素相當于引用類型的變量

---------------------------------------

集合架構的類圖關系

JDK所提供的容器API全部位于java.util包中。

容器API的類圖關系如下:

《黑馬程式員》java筆記->集合架構集合大總結
《黑馬程式員》java筆記->集合架構集合大總結

Collection接口中的方法

(1) int size();

(2) boolean isEmpty();

(3) void clear();

(4) boolean contains(Object element);

(5) boolean add(Object element);

(6) boolean remove(Object element);

(7) Iterator iterator();

(8) boolean containsAll(Collection c);

(9) boolean addAll(Collection c)

(10) boolean removeAll(Collection c)

(11) boolean retainAll(Collection c)

(12) Object[] toArray();

-------------------------------------------------

Collection方法舉例

public static void main(String args[])

{

Collection c=new ArrayList();

c.add("hello world");

c.add(new Integer(100));

c.add(new Float(99.9f));

System.out.println(c.size());

System.out.println(c);

}

---------------------------------

List接口

List是Collection的子接口,實作List接口的容器中存放的對象是有順序的,而且可以重複。

List容器中存放的對象都有一個整數型的序号,記錄該對象在容器中的位置,可以根據序号來通路容器中的元素。

JDK提供實作List接口的類有ArrayList、LinkedList等。

    Object get(int index)

    Object set(int index,Object obj)

    void add(int index,Object obj)

    Object remove(int index)

    int indexOf(Object obj)

    int lastIndexOf(Object obj)

-------------------------------------------

List接口舉例

List li=new ArrayList();

for(int i=0;i<10;i++)

li.add("a"+i);

System.out.println(li);

li.add(3,"a20");

System.out.println(li);

li.set(4,"a30");

System.out.println(li);

System.out.println((String)li.get(2));

li.remove(0);

System.out.println(li);

-----------------------------------------------

List接口的實作類-ArrayList

java.util.ArrayList實作了List接口,用于描述長度可變的數組清單(底層采用數組實作)。

ArrayList允許元素取值為null,提供了一些新增的方法來操作清單的容量的大小。

public ArrayList()(預設大小是10)

public ArrayList(int initialCapacity)

public void ensureCapacity(int minCapacity)

public void trimToSize()

----------------------------------------------------

ArrayList舉例

ArrayList list=new ArrayList(6);

list.add("oyhj");

list.add(new Integer(10));

list.add(new Double(10.5));

         System.out.println(list.size());

Object item[]=list.toArray();

for(int i=0;i<item.length;i++)

   System.out.println(item[i]);

 list.trimToSize();           

----------------------------------------------------------

List接口的實作類-Vector

java.util.Vector實作了List接口,用于描述長度可變的數組向量(底層采用數組實作)。

與ArrayList的差別:Vector是線程安全的(同步),用在多線程環境中,運作效率慢。ArrayList不是線程安全的,用在單線程環境中。

Vector類的新增方法:

public Vector()(預設大小是10)

public Object elementAt(int index)

public void removeElement(int index)

public void insertElement(Object obj,int index)

public boolean removeElement(Object obj)

public void removeAllElements()

public Object toArray()

-----------------------------------------------------------

Stack類

java.util.Statck繼承自Vector類,對應”First In,Last out”的資料結構-棧。

Stack類的常用方法:

public Statck()

public Object push(Object obj)

public Object pop()

public Object peek()

public boolean isEmpty()

public void clear()

public int search(Object obj)    

                                              見源檔案:Stack/StackTest.java              

------------------------------------------------------------

Set接口

Set接口是Collection的子接口,Set接口沒有提供新增的方法,但實作Set接口的容器中元素是沒有順序的且不可以重複。

Set容器可以與數學中的“集合”概念相對應。

JDK中提供的實作Set接口的類有HashSet、TreeSet等。

-------------------------------------------------------------

HashSet

HashSet hs=new HashSet();

 hs.add("first");

 hs.add("second");

 hs.add("third");

 hs.add("fourth");

 hs.add("first");

 hs.add(new Date());

 System.out.println("哈希表的大小:"+hs.size());

 System.out.println(hs);

--------------------------------------------------------------

Set接口與集合操作相關的幾個方法

Set s1=new HashSet();

Set s2=new HashSet();

s1.add("a");s1.add("b");s1.add("c");

s2.add("b");s2.add("c");s2.add("d");

Set s3=new HashSet(s1);

s3.retainAll(s2);//求交集

Set s4=new HashSet(s2);

s4.addAll(s1);//求并集

System.out.println(s3);

System.out.println(s4);

---------------------------------------------------------------

Set接口的實作類-TreeSet

TreeSet描述的是Set的一個變體-可實作排序功能的集合。

将對象插入到TreeSet中時,會按照某種比較規則将對象插入到一個有序序列中,以保證TreeSet集合中的對象序列保持“升序”排列。

----------------------------------------------------------

Comparable接口

問題:TreeSet中的排序方法是根據什麼确定對象之間的”大小”關系呢?

所有可排序的類都實作了java.lang.Comparable接口,該接口中隻有一個抽象方法: 

   public int compareTo(Object obj) 

 注意:使用者在實作compareTo()方法确定比較邏輯時,比較結果應該和equals()方法比較的結果一緻。

----------------------------------------------------------------

Map接口

實作Map接口的類用來存儲”鍵-值”對。

  可了解為一張二維表,這個二維表隻有兩列,一列是Key,一列是Value。

Map中存儲的“鍵-值”對由鍵來辨別,是以鍵不能重複。

Map接口的實作類有HashMap和TreeMap。

Map接口的常用方法:

Object put(Object key,Object value)

Object get(Object key)

Object remove(Object key)

boolean containsKey(Object key)

boolean containsValue(Object value)

int size()

boolean isEmpty()

void putAll(Map t)

void clear()

----------------------------------------------------------------

Map接口的實作類-HashMap

java.util.HashMap類實作了java.util.Map接口,基于哈希表實作“鍵”-“值”對的映射關系。

HashMap不确定“K”-”value”對的先後順序,允許使用null “K”和null”value”。

影響HashMap性能的兩個因素:

  初始容量(Initial Capacity)

  加載因子(Load Factor)   (小于1的數)

---------------------------------------------------------------

Map接口的實作類-Hashtable

java.util.Hashtable實作了java.util.Map接口,也是采用哈希表的形式将”Key”映射到”Value”,用法與HashMap基本相同。

  HashMap與Hashtable的差別:

  (1) Hashtable中的“key”和“value”都不允許null,而HashMap允許。

  (2) Hashtable是線程安全的,适合在多使用者環境中使用,效率稍低;HashMap不是線程安全的,效率稍高,适合在單線程環境下使用。

-----------------------------------------------------------------

Iterator接口

Iterator(稱作疊代器)接口主要提供了對容器中元素進行周遊的方法。

所有實作了Collection接口的類都有一個iterator()方法來傳回一個實作了Iterator接口的類的對象。 

該接口中定義了如下抽象方法:boolean hasNext() 

//判斷遊标右邊是否還有元素

Object next()

//傳回遊标右邊的元素并将遊标移動到該元素後

void remove()

 //删除遊标左邊的元素,通常在next()方法之後執行,隻執行一次

《黑馬程式員》java筆記-&gt;集合架構集合大總結
《黑馬程式員》java筆記-&gt;集合架構集合大總結

------------------------------------------------------------

Iterator接口舉例

Collection c=new ArrayList();

 c.add("hello world");

 c.add(new Integer(100));

 c.add(new Float(99.9f));

 Iterator it=c.iterator();

  while(it.hasNext())

   {

     Object obj=it.next();

     System.out.println(obj);

          it.remove();

   } 

       System.out.println(c);     

----------------------------------------------------------------

Enumeration接口

Enumeration接口的功能與Iterator接口類似,也能夠對集合中的元素進行周遊。但是Enumeration接口隻對Vector、Hashtable類提供周遊方法,并且不支援移除操作。 

   boolean hasMoreElements() 

   //判斷此枚舉中是否有下一個元素

   Object nextElement()

  //傳回枚舉中的下一個元素

--------------------------------------------------------------

List常用算法-由Collections類實作

java.util.Collections類提供了一些靜态方法,實作了基于List容器的常用算法。

void sort(List list)      對容器内的元素進行升序排序

void reverse(List list) 對容器内的元素進行逆序排列

void shuffle(List list)  對List容器内的元素進行随機排列

void fill(List list,Object obj) 對特定的對象來填充list

void copy(List des,List src)  将src容器中的内容拷貝到des容器中

Object max(Colletion c)       Object min(Collection c)

void rotate(List list,int distance) 對清單中元素按distance進行移位操作

int binarySearch(List list,Object obj)

采用折半查找在list中尋找obj對象,傳回這個對象在容器中的位置

(注意調用此方法前必須對清單進行升序排序,否則結果不确定)

--------------------------------------------------------------

Arrays類

java.util.Arrays類提供了對數組進行操作的靜态方法,實作了對數組元素進行排序、查找、轉換為字元串形式和清單等功能。

List asList(Object a[ ])

Void sort(Object a[ ])

String toString(Object a[ ])

int binarySearch(Object a[ ],Object key)

-------------------------------------------------------------------

JDK1.5增強的for循環

增強的for循環對于周遊Array和Collection的時候相當便利。

int array[]={1,2,3,4,5};

for(int i:array)

  System.out.println(i);

Collection c=new ArrayList();

c.add("hello world");

c.add(new String("oyhj"));

c.add(new Float(99.9f));

   for(Object obj:c)

     System.out.println(obj);

-------------------------------------------------------------

增強的For循環

缺點:

   數組:不能通過下标通路數組元素

  集合:與使用Iterator相比,不能友善的删除集合中的元素。

注:除了簡單的周遊讀取内容外,不建議使用增強的for循環。

-----------------------------------------------------------

Auto Boxing/unBoxing

DK1.5支援在适當時候自動打包/解包的功能

打包:自動将基礎資料類型轉換成與之對應的封  裝類的對象

解包:自動将封裝類的對象轉換成與之對應的基本資料類型

1-2-2-6陣形

1個圖  (門将)

2個類(Collections,Arrays) (前鋒)

2個知識點 (中場)

  增強的For循環

  Auto-boxing/unboxing

6個接口 (後衛)

     Collection Set List Map Iterator Comparable