1. 程式人生 > >java集合框架詳解(一)

java集合框架詳解(一)

2,總體體系結構

 

                                                                                                                                                 圖(1

        分析:

       在整個java類集中最常使用的類集介面有CollectionSetListMap介面,注意以上都是介面,CollectionListSet兩個介面的基介面,都不能例項化。而我們可以將類集介面(集合類)分為兩個大類,一類集合類繼承Collection

介面,另一類集合類繼承Map介面。至於為什麼這麼區別,是有原因的,CollectionMap介面之間的主要區別:Collection中儲存了一組物件,而Map儲存關鍵字/值對。他們的關係如上圖(1)所示,其中HashSetLinkedListArrayListHashMap是用於實現對應介面的類。

       Collection介面定義了存取一組物件的方法,其中子介面SetList分別定義了儲存方式。

            . Set中的資料物件沒有順序且不可以重複。

            . List中的資料物件有順序且可以重複。

       Map介面定義儲存“鍵(key)----

(value)對映對”的方法

下面將分節詳細介紹,不過在詳細介紹之前我們有必要再來了解一下三種集合型別,注意是集合型別,而我們下下面要搞清楚的是去實現這些集合型別所用的集合類。set(集)、list(列表)和map(對映)

        (1)set(集)集(set)是最簡單的一種集合,它的物件不按特定方式排序,只是簡單的把物件加入集合中,就像往口袋裡放東西。對集中成員的訪問和操作是通過集中物件的引用進行的,所以集中不能有重複物件。 

        (2)list(列表)列表的主要特徵是其物件以線性方式儲存,沒有特定順序,只有一個開頭和一個結尾,比如連結串列式。當然,它與根本沒有順序的集是不同的。列表在資料結構中分別表現為:陣列和向量、連結串列、堆疊、佇列。 

關於實現列表的集合類,是我們日常工作中經常用到的,將在後邊的筆記詳細介

        (3)map(對映對映與集或列表有明顯區別,對映中每個項都是成對的。對映中儲存的每個物件都有一個相關的關鍵字(Key)物件,關鍵字決定了物件在對映中的儲存位置,檢索物件時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的。關鍵字本身並不能決定物件的儲存位置,它需要對過一種雜湊(hashing)技術來處理,產生一個被稱作雜湊碼(hash code)的整數值,雜湊碼通常用作一個偏置量,該偏置量是相對於分配給對映的記憶體區域起始位置的,由此確定關鍵字/物件對的儲存位置。理想情況下,雜湊處理應該產生給定範圍內均勻分佈的值,而且每個關鍵字應得到不同的雜湊碼。

3、ClollectionMap

Java集合類主要由兩個介面派生出來:

     Collection

Set :不能存放重複物件

                    List :可存放重複物件,有序

                    Queue :佇列

                    SortedSet:可對集合資料排序

                    SortedSet :可對集合資料排序Map

     Map

          hashMap

          SortedMap:可對集合資料排序

3.1 Collection介面

Collection是最基本的集合介面,一個Collection代表一組Object,即Collection的元素(Elements)。一些 Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java JDK不提供直接繼承自Collection的類,Java JDK提供的類都是繼承自Collection的“子介面”如ListSet。也就是說JDK不提供此介面的任何直接實現:它提供更具體的子介面(如 Set 和 List)實現。此介面通常用來傳遞 collection,並在需要最大普遍性的地方操作這些 collection。 

( CollectionListSet兩個介面的基介面,ListCollection之上增加了"有序"SetCollection之上增加了"唯一" 。)

Collection介面有如下基本通用方法: 

   boolean add(Object o):該方法用於向集合裡面新增一個元素,若集合物件被新增操作改變了,返回true.
   boolean addAll(Collection c):把集合c裡面的所有元素新增到指定集合裡面去,如果集合物件被新增操作改變了返回true.
   void clear():清除集合裡面的所有元素,將集合長度變為0。
   boolean contains(Object o):返回集合裡是否包含指定的元素。
   boolean containsAll(Collection c):返回集合裡是否包含集合c內所有的元素。
   boolean isEmpty():返回集合是否為空(長度是否為0)。
   Iterator iterator():返回一個Iterator物件,用於遍歷集合裡的元素。
   boolean remove(Object o):刪除集合中指定元素o。
   boolean removeAll(Collection c):從集合中刪除集合c裡面的元素。若刪除一個或以上返回true。
   boolean retainAll(Collection c):從集合中刪除集合c裡不包含的元素。
   int size():得到集合元素的個數。
   Object[] toArray():把集合轉成一個數組,所有集合元素程式設計陣列元素。

接下來將在程式例項中詳細介紹這些方法的意義以及用法

演示程式1:程式中有詳細方法的分析

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;


/**
 * 在集合裡的儲存,永遠存的是  一個引用地址
 * @author will
 *
 */
public class Collectionadd {
	public static void main(String[] args) {
//—————————————————————————————————add、addAll方法演示——————————————————————————————————————————————————————————		
		Collection c = new ArrayList();//這裡要特別注意,ArrayList可以用Collection的其他實現類來取代
	    //這是一個向上轉型
		
		c.add("A");
		boolean b = c.add("B");
		System.out.println(b);//TRUE
		c.add(1);//java5之前不允許,Java5之前沒有自動裝箱
		c.add(new Integer(2));//這是JAVA5之前採用的處理方法
		c.add(3);
		
		System.out.println(c);//[A, B, 1, 2, 3]
		StringBuilder s = new StringBuilder("AAAAA");
		c.add(s);
		System.out.println(c);//[A, B, 1, 2, 3, AAAAA]
		
		s.append("BBBBB");
		System.out.println(s);//列印結果是AAAAABBBBB表明集合裡的儲存的是 一個引用地址
		System.out.println(c);//[A, B, 1, 2, 3, AAAAABBBBB]
		Collection c2 = new ArrayList();
		c2.add("hello");
		c2.add("今天的日期:" + new Date());//Mon Jun 08 14:11:53 CST 2015
		c.addAll(c2);
		System.out.println(c);
		c.clear();
		System.out.println(c);
//———————————————————————————————————add、addAll方法演示——————————————————————————————————————————————————————————
	
	
	}
	
}

演示程式2:程式中有詳細的方法分析

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;


		
//——————————————————————contains、isEmpty、remove、retainAll、size、Object[] toArray()——————————————————————————————
public class CollectionQitafangfa {
	public static void main(String[] args) {
		
		Collection c = new ArrayList();
		c.add("AB");
		c.add("C");
		c.add(new Integer(1));
		c.add("你好啊");
		System.out.println(c);//[AB, C, 1, 2]
		Collection c2 = new ArrayList();
	    c2.add("C");
		c2.add("你好啊");
			
					/*JDK裡方法的釋意:
					 * boolean contains(Object o) 
					          如果此 collection 包含指定的元素,則返回 true。 
					   boolean containsAll(Collection<?> c) 
					          如果此 collection 包含指定 collection 中的所有元素,則返回 true。 
					*/
		
		System.out.println(c.contains("你好啊"));//集合c中如果包含"你好啊"則返回true
		System.out.println(c.containsAll(c2));  //集合c中如果包含集合c2中的所有元素則返回true
		System.out.println(c2.containsAll(c));  //結果false
		
					/*JDK裡方法的釋意:
					 *  boolean isEmpty() 
			         	如果此 collection 不包含元素,則返回 true。 
				    */
		
		System.out.println("c集合是否為空: "+c.isEmpty());//C集合是否為空:false
		
					/*JDK裡方法的釋意:
					 * boolean remove(Object o) 
					          從此 collection 中移除指定元素的單個例項,如果存在的話(可選操作)。 
					   boolean removeAll(Collection<?> c) 
					          移除此 collection 中那些也包含在指定 collection 中的所有元素(可選操作)。 
					*/
		System.out.println(c.remove("你好啊"));//有,且移除,結果返回true
		System.out.println(c.remove("我不好"));//集合c中沒有"我不好"這一元素,所以返回false
		System.out.println(c);//[AB, C, 1]
		
		c.removeAll(c2);//意思是移除集合c中的那些元素(即集合c與集合c2的交集元素)
		System.out.println(c);//[AB, 1]
		System.out.println(c2);//[C, 你好啊]
					/*JDK裡方法的釋意:
					 *  boolean retainAll(Collection<?> c) 
			          		僅保留此 collection 中那些也包含在指定 collection 的元素(可選操作)。 
					*/
		
		c2.add(1);
		System.out.println(c2);//[C, 你好啊, 1]
		c.retainAll(c2);//首先求集合c與集合c2的交集,然後把交集留下在c集合中。
		System.out.println(c);//結果是1
		
					/*JDK裡方法的釋意:
					 *  int size()  返回此 collection 中的元素數。 
					 */
		
		System.out.println(c.size());//1
		c.add(2);
		c.add("A");
		c.add("B");
		System.out.println(c.size());//4
					/*JDK裡方法的釋意:
					 * Object[] toArray()//這裡toArray()的型別是Object[].集合可以轉成任意資料型別 
			          		返回包含此 collection 中所有元素的陣列。 
					 */
					
		
		Object[] ot = c.toArray();//利用集合Collection 的方法來建立一個Object類物件
		
		for (Object o : ot) {
			System.out.println(o);//1,2,A,B
		}
		/**
		 * for-each使用的場合, 陣列和 Iterable物件
		 */
		System.out.println("------------------");
		
		for (Object object : c) {
			System.out.println(object);//1,2,A,B
		}
//——————————————————————contains、isEmpty、remove、retainAll、size、Object[] toArray()——————————————————————————————————————————	
	
	}
}

   不過在介紹Iterator iterator() 方法之前我們有必要先了解一下下面的知識

   對於Iterator介面JDK文件

    首先實現了Collection介面的容器類都有一個iterator方法用以返回一個實現了Iterator介面的物件,其中Iterator物件稱為迭代器,用以方便的實現對容器內元素的遍歷操作。Iterator介面主要有以下幾個方法:

     Boolean hasNext()//判斷遊標右邊是否有元素

     Object next();    //返回遊標右邊的元素並將遊標移動到下一個位置

     Void remove();   //刪除遊標左面的元素,在執行完next之後該操作只能執行一次

    

    所有實現Collection介面的類都必須提供兩個標準的建構函式:無引數的建構函式用於建立一個空的Collection,有一個 Collection引數的建構函式用於建立一個新的Collection,這個新的Collection與傳入的Collection有相同的元素。後一個建構函式允許使用者複製一個Collection。如何遍歷Collection中的每一個元素?不論Collection的實際型別如何,它都支援一個iterator()的方法,該方法返回一個迭代子,使用該迭代子即可逐一訪問Collection中每一個元素。典型的用法如下:

    Iterator it=collection.iterator();  //獲得一個迭代子

    while(it.hasNext()){

         Object obj=it.next();          //得到下一個元素

}

看下面程式例項:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionIterator{
	public static void main(String[] args) {
		
		Collection c = new ArrayList();
		c.add("AB");
		c.add("C");
		c.add(new Integer(1));
		c.add("你好啊");
		System.out.println(c);//[AB, C, 1, 2]
			
//————————————————————————————————————————————Iterator iterator()方法————————————————————————————————————————————————————————————	
		/**來自JDK
		 *  Iterator iterator()    返回在此 collection 的元素上進行迭代的迭代器。 
		 *  
		 *  Iterator介面類中的方法:
		 *  boolean hasNext() 
		          		如果仍有元素可以迭代,則返回 true。 
		 	Object next() 
		          		返回迭代的下一個元素。 
		    void remove() 
		          		從迭代器指向的 collection 中移除迭代器返回的最後一個元素(可選操作)。 

		 */
		Iterator it = c.iterator();//條用集合的iterator方法來建立一個迭代器(Tterator)物件it
//(一):輸出集合c中元素
		System.out.println("輸出集合c中元素方式(一)-------------------------------------------------------------------");
		//每呼叫next方法後,指標就會向後移動一個位置
		System.out.println("----->"+it.next());
		System.out.println("----->"+it.next());
		System.out.println("----->"+it.next());
		System.out.println("----->"+it.next());
		//System.out.println(it.next());
		//上面這條語句不能繼續執行了,因為指標已到最後,沒有下一個元素了,否則報錯
		

		System.out.println(it.hasNext());//這個地方呼叫hasNext()方法來檢視還有沒有下一個集合元素。false
			if(it.hasNext()){
				System.out.println("----->"+it.next()); //這裡是沒有的,所以在上一句程式碼返回false之後,這裡不執行
			}
	   
//(二)	:輸出集合c中元素
		System.out.println("輸出集合c中元素方式(二)-------------------------------------------------------------------");
		it = c.iterator();
		while(it.hasNext()){
			System.out.println("----->"+it.next());
		}
		
		
//(三)	:輸出集合c中元素
		System.out.println("輸出集合c中元素方式(三)-------------------------------------------------------------------");
		/*
		 * for(it = c.iterator();it.hasNext();){
			System.out.println("for----->"+it.next());
			}
			
			效能高一低;此時it在for語句裡建立,宣告週期短一些
		 * 
		*/
		
		for(it = c.iterator();it.hasNext();){//這裡for迴圈的第三個條件未寫,是因hasNext已經將指標移動到了下一個元素
			System.out.println("----->"+it.next());
		}
		
		
//————————————————————————————————————————————Iterator iterator()方法———————————————————————————————————————————————————————		
	}
}

未完待續......