? ? Java集合框架將不同特設(shè)類(如)統(tǒng)一起來,使得基本集合(動態(tài)數(shù)組,鏈表,樹,哈希表)的實(shí)現(xiàn)比較高效,允許不同類型的集合,以類似的方式工作,具有高度的互操作性,此外,也使得對一個集合的擴(kuò)展和適應(yīng)相對簡單。簡單點(diǎn)說就是可以將不同的操作集合在一起,并且可以互相轉(zhuǎn)換和操作,而且比原本的操作方法更加高效。下圖為Java集合框架圖:

????Java 集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(Map),存儲鍵/值對映射。集合框架的構(gòu)成包括接口,實(shí)現(xiàn)類(具體類)和算法,類和接口位于java.util包中,需要時導(dǎo)入包就可以使用。下面敘述詳細(xì)的一些接口和實(shí)現(xiàn)類:
集合接口
Collection 接口是最基本的集合接口,一個 Collection 代表一組 Object,即 Collection 的元素, Java不提供直接繼承自Collection的類,只提供繼承于的子接口(如List和set)。Collection 接口存儲一組不唯一,無序的對象。
List 接口? 是一個有序的 Collection,使用此接口能夠精確的控制每個元素插入的位置,能夠通過索引(元素在List中位置,類似于數(shù)組的下標(biāo))來訪問List中的元素,第一個元素的索引為 0,而且允許有相同的元素。List 接口存儲一組不唯一,有序(插入順序)的對象。List和數(shù)組類似,可以動態(tài)增長,根據(jù)實(shí)際存儲的數(shù)據(jù)的長度自動增長List的長度。查找元素效率高,插入刪除效率低,因?yàn)闀鹌渌匚恢酶淖?,其實(shí)現(xiàn)類有ArrayList,LinkedList,Vector。
Set? 具有與 Collection 完全一樣的接口,只是行為上不同,Set 不保存重復(fù)的元素。Set 接口存儲一組唯一,無序的對象。Set檢索效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變,其實(shí)現(xiàn)類有HashSet,TreeSet。
SortedSet? 繼承于Set保存有序的集合。
Map接口存儲一組鍵值對象,提供key(鍵)到value(值)的映射。
Map.Entry? 描述在一個Map中的一個元素(鍵/值對)。是一個Map的內(nèi)部類。
SortedMap? 繼承于 Map,使 Key 保持在升序排列。
Enumeration? 這是一個傳統(tǒng)的接口和定義的方法,通過它可以枚舉(一次獲得一個)對象集合中的元素。這個傳統(tǒng)接口已被迭代器取代。
集合實(shí)現(xiàn)類(集合類)
AbstractCollection? 實(shí)現(xiàn)了大部分的集合接口。
AbstractList??繼承于AbstractCollection 并且實(shí)現(xiàn)了大部分List接口。
AbstractSequentialList??繼承于 AbstractList ,提供了對數(shù)據(jù)元素的鏈?zhǔn)皆L問而不是隨機(jī)訪問。
LinkedList? 實(shí)現(xiàn)了List接口,允許有null(空)元素。主要用于創(chuàng)建鏈表數(shù)據(jù)結(jié)構(gòu),該類沒有同步方法,如果多個線程同時訪問一個List,則必須自己實(shí)現(xiàn)訪問同步,解決方法就是在創(chuàng)建List時候構(gòu)造一個同步的List。List? list=Collections.synchronizedList(newLinkedList(...));但LinkedList 查找效率低。
ArrayList? 實(shí)現(xiàn)了List的接口,實(shí)現(xiàn)了可變大小的數(shù)組,隨機(jī)訪問和遍歷元素時,提供更好的性能。該類也是非同步的,在多線程的情況下不要使用。ArrayList 增長當(dāng)前長度的50%,插入刪除效率低。
AbstractSet??繼承于AbstractCollection 并且實(shí)現(xiàn)了大部分Set接口。
HashSet? 實(shí)現(xiàn)了Set接口,不允許出現(xiàn)重復(fù)元素,不保證集合中元素的順序,允許包含值為null的元素,但最多只能一個。
LinkedHashSet? 具有可預(yù)知迭代順序的Set接口的哈希表和鏈接列表實(shí)現(xiàn)。
TreeSet? 實(shí)現(xiàn)了Set接口,可以實(shí)現(xiàn)排序等功能。
AbstractMap??實(shí)現(xiàn)了大部分的Map接口。
HashMap? 是一個散列表,存儲的內(nèi)容是鍵值對(key-value)映射。實(shí)現(xiàn)了Map接口,根據(jù)鍵的HashCode值存儲數(shù)據(jù),具有很快的訪問速度,最多允許一條記錄的鍵為null,不支持線程同步。
TreeMap? 繼承了AbstractMap,并且使用一顆樹。
WeakHashMap? 繼承AbstractMap類,使用弱密鑰的哈希表。
LinkedHashMap? 繼承于HashMap,使用元素的自然順序?qū)υ剡M(jìn)行排序.
IdentityHashMap? 繼承AbstractMap類,比較文檔時使用引用相等。
集合算法
集合框架定義了幾種算法,可用于集合和映射。這些算法被定義為集合類的靜態(tài)方法。
在嘗試比較不兼容的類型時,一些方法能夠拋出 ClassCastException異常。當(dāng)試圖修改一個不可修改的集合時,拋出UnsupportedOperationException異常。
集合定義三個靜態(tài)的變量:EMPTY_SET,EMPTY_LIST,EMPTY_MAP的。這些變量都不可改變。
Collection Algorithms 是一個列表中的所有算法實(shí)現(xiàn)。
這里需要講到的一個是迭代器,迭代器是使你能夠通過循環(huán)來得到或刪除集合的元素的操作。ListIterator 繼承了Iterator,以允許雙向遍歷列表和修改元素。該方法可以不用擔(dān)心在遍歷的過程中會超出集合的長度。下面會通過實(shí)例列出其實(shí)現(xiàn)方法。
遍歷 ArrayList
Java代碼實(shí)例
import java.util.ArrayList;
import java.util.Iterator;
//Java集合框架,遍歷-ArrayList
public class ArrayListTest {
public ArrayListTest(){
ArrayList list =new ArrayList();? ? ? ? ? ? ? ? ? ? ? ?//申明一個線性表list
? ? ? ? list.add("遍");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //向列表添加元素
? ? ? ? list.add("歷");? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //第一種遍歷,使用for遍歷List
? ? ? ? System.out.println("使用for遍歷List:");
for(String str:list){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //相當(dāng)于for (int i=0;i<list.size();i++)
? ? ? ? ? ? System.out.println(str);
}
//第二種遍歷,把鏈表變?yōu)閿?shù)組相關(guān)的內(nèi)容進(jìn)行遍歷
? ? ? ? String[] Str =new String[list.size()];? ? ? ? ? ? ? ? ? ? ? ?//申明數(shù)組,存放鏈表元素
? ? ? ? list.toArray(Str);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//將列表元素存入數(shù)組
? ? ? ? System.out.println("把鏈表變?yōu)閿?shù)組相關(guān)的內(nèi)容進(jìn)行遍歷:");
for (int i=0;i
? ? ? ? ? ? System.out.println(Str[i]);
}
//第三種遍歷 使用迭代器進(jìn)行相關(guān)遍歷
? ? ? ? Iterator ite = list.iterator();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//申明一個迭代器對象ite
? ? ? ? System.out.println("使用迭代器進(jìn)行相關(guān)遍歷:");
while(ite.hasNext()){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //迭代器判斷是否存在下一個元素
? ? ? ? ? ? System.out.println(ite.next());
}
}
}
運(yùn)行結(jié)果:

遍歷Map
Java代碼實(shí)例
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
//Java集合框架,遍歷-Map
public class MapTest {
public MapTest(){
Map map =new HashMap();? ? ? ? ? ? ? ? //申明一個Map對象map且由HashMap接口實(shí)現(xiàn)
? ? ? ? map.put("admin","123");? ? ? ? ? ? ? //往Map中添加元素
? ? ? ? map.put("norml","456");
map.put("default","default");
//第一種:普遍使用,二次取值
? ? ? ? System.out.println("通過Map.keySet遍歷key和value:");
for (String key:map.keySet()){? ? ? ? ? ? ? ? ?//直接讀取map中存放的鍵值對
? ? ? ? ? ? System.out.println("賬號:"+key+"? ? 密碼:"+map.get(key));
}
//第二種
? ? ? ? System.out.println("通過Map.entrySet使用iterator遍歷key和value:");
Iterator> ite = map.entrySet().iterator();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//申明一個迭代器對象ite
? ? ? ? while(ite.hasNext()){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //判斷是否存在下一組元素組
? ? ? ? ? ? Map.Entry entry = ite.next();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //將迭代器取出的元素組存放到Map.entry
? ? ? ? ? ? System.out.println("賬號:"+entry.getKey()+"? ? 密碼:"+entry.getValue());
}
//第三種:推薦,尤其是容量大時
? ? ? ? System.out.println("通過Map.entrySet遍歷key和value:");
for (Map.Entry ent:map.entrySet()){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//將map中的鍵值對存放到Map.Entry對象中
? ? ? ? ? ? System.out.println("賬號:"+ent.getKey()+"? ? 密碼:"+ent.getValue());
}
//第四種
? ? ? ? System.out.println("通過Map.values()遍歷所有的value,但不能遍歷key");
for (String v:map.values()){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//遍歷map中鍵的值
? ? ? ? ? ? System.out.println("賬號:未知? ? 密碼為:"+v);
}
}
}
運(yùn)行結(jié)果:
