java集合框架詳解(一)
2,總體體系結構
圖(1)
分析:
在整個java類集中最常使用的類集介面有Collection、Set、List、Map介面,注意以上都是介面,Collection是List和Set兩個介面的基介面,都不能例項化。而我們可以將類集介面(集合類)分為兩個大類,一類集合類繼承Collection
Collection介面定義了存取一組物件的方法,其中子介面Set和List分別定義了儲存方式。
. Set中的資料物件沒有順序且不可以重複。
. List中的資料物件有順序且可以重複。
Map介面定義儲存“鍵(key)----
下面將分節詳細介紹,不過在詳細介紹之前我們有必要再來了解一下三種集合型別,注意是集合型別,而我們下下面要搞清楚的是去實現這些集合型別所用的集合類。set(集)、list(列表)和map(對映)。
(1)set(集)集(set)是最簡單的一種集合,它的物件不按特定方式排序,只是簡單的把物件加入集合中,就像往口袋裡放東西。對集中成員的訪問和操作是通過集中物件的引用進行的,所以集中不能有重複物件。
(2)list(列表)列表的主要特徵是其物件以線性方式儲存,沒有特定順序,只有一個開頭和一個結尾,比如連結串列式。當然,它與根本沒有順序的集是不同的。列表在資料結構中分別表現為:陣列和向量、連結串列、堆疊、佇列。
(3)map(對映) 對映與集或列表有明顯區別,對映中每個項都是成對的。對映中儲存的每個物件都有一個相關的關鍵字(Key)物件,關鍵字決定了物件在對映中的儲存位置,檢索物件時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的。關鍵字本身並不能決定物件的儲存位置,它需要對過一種雜湊(hashing)技術來處理,產生一個被稱作雜湊碼(hash code)的整數值,雜湊碼通常用作一個偏置量,該偏置量是相對於分配給對映的記憶體區域起始位置的,由此確定關鍵字/物件對的儲存位置。理想情況下,雜湊處理應該產生給定範圍內均勻分佈的值,而且每個關鍵字應得到不同的雜湊碼。
3、Clollection與Map
Java集合類主要由兩個介面派生出來:
Collection
Set :不能存放重複物件
List :可存放重複物件,有序
Queue :佇列
SortedSet:可對集合資料排序
SortedSet :可對集合資料排序MapMap
hashMap
SortedMap:可對集合資料排序
3.1 Collection介面
Collection是最基本的集合介面,一個Collection代表一組Object,即Collection的元素(Elements)。一些 Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java JDK不提供直接繼承自Collection的類,Java JDK提供的類都是繼承自Collection的“子介面”如List和Set。也就是說JDK不提供此介面的任何直接實現:它提供更具體的子介面(如 Set 和 List)實現。此介面通常用來傳遞 collection,並在需要最大普遍性的地方操作這些 collection。
( Collection是List和Set兩個介面的基介面,List在Collection之上增加了"有序",Set在Collection之上增加了"唯一" 。)
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()方法———————————————————————————————————————————————————————
}
}
未完待續......