提到集合我們自然會想到數組,在平時編程時數組的使用讓我們的代碼更簡單容易理解。但是數組的一些特性有時也不能滿足我們的需要。比如數組的長度是固定的,而集合的長度是可變的。
下面我們就一起來看看集合。
下圖是一張集合的繼承關系圖.Collection接口是層次結構中的根接口.通常不能直接使用,但是該接口提供了添加和刪除元素、管理數據的方法。由于list和set接口都實現了Collection接口,因此這些方法對List集合和Set集合都是通用的。

### List(列表)
List部分分為list接口和兩個實現類Arraylist和Linkedlist。
List接口中適合于自身的方法都與索引有關。List集合以線性方式存儲對象,因此可以通過對象的索引來操作對象。
1.ArrayList
該類實現了可變的數組,允許所有的元素,包含null。可以根據索引位置對集合進行快速的隨機訪問。缺點是向指定的索引位置插入對象或刪除對象的速度較慢
List<String>list1=new ArryaList<String>();
2.LinkedList
該類采用鏈表結構保存對象。這種結構的優點是便于向集合中插入和刪除對象。但是隨機訪問集合中的對象時效率較慢。
List<String> list2=new LinkedList<String>();
### Set(集合)
Set集合中不允許存在重復值。而且集合中的對象是無序的,遍歷set集合的結果與插入set集合的結果不一定是相同的。在實際的使用中,我們使用最多的特性是set能夠去掉重復的元素并獲取響應的數據。
Set的實現類為TreeSet和HashSet。TreeSet和HashSet的不同就是前者存入的時候會按照一定的順序存入,Treeset是一個有序的集合,默認的情況下按照自然順序進行排序。HashSet是基于Hash算法實現的,其性能通常都優于TreeSet。我們通常都應該使用HashSet,在我們需要排序的功能時,我們才使用TreeSet。
### Map(映射)
Map接口中提供了將鍵映射到值的對象。一個映射不能包含重復的鍵,每個鍵最多只能映射到一個值。由于Map集合中的元素是通過Key,value進行存儲的。要獲得集合中指定的key值和value值,需要先通過相應的方法獲取key集合或value集合。再遍歷key集合或value集合獲取指定值。
1.HashMap
此實現提供了所有可選的映射操作,并允許使用null值和null鍵。但必須保證鍵的唯一性。HashMap通過哈希編碼對齊內容的映射關系進行快速查找。此類不保證映射的順序,
2.TreeMap
該類實現了Map接口和storedMap接口。因此集合中的映射關系具有一定的順序。但是在添加。刪除和定位上比Hashmap性能要差一些。由于TreeMap類實現的Map集合中的映射關系是按照一定的順序排列的,因此不能為null值。
在使用過程中可以通過HashMap類創建Map集合,當需要順序輸出時,再創建一個完全相同的映射關系額TreeMap類實例。
(該實例表示了將HashMap表示成TreeMap)
~~~
public static void main(String[] args) {
Map map=new HashMap();//定義一個hashmap
map.put("李","李");//向容器中添加數據
map.put("王","王");
map.put("趙","趙");
map.put("錢","錢");
Set set=map.keySet();//獲取Map集合中的key對象集合
Iterator it=set.iterator();
while(it.hasNext())
{//遍歷Map集合
String str=(String)it.next();
String name=(String)map.get(str);//通過key得到value值
System.out.println(str+""+name);//輸出HashMap類實現的集合(無序)
}
TreeMap treemap=new TreeMap();
treemap.putAll(map);//向集合中添加對象,將HashMap轉換為TreeMap;
Iterator iter=treemap.keySet().iterator();
while(iter.hasNext()){
String str=(String ) iter.next();
String name=(String)map.get(str);
System.out.println(str+""+name);//輸出Treemap類實現的集合(有序)
}
}
~~~
### 迭代器
從上面我們可以看到java中有這么多的接口。對數據容器的操作在很多的時候都有很多相同的地方,于是java采用迭代器這種公共的操作接口。使用java迭代器可以使得對容器的遍歷操作完全與底層隔離,可以達到極好的解耦效果。
所有實現了Collection接口的容器都有一個iterator方法用以返回一個實現了Iterator接口的對象。
~~~
public class IteratorDemo {
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<10;i++)
{
list.add(i);
}
System.out.println("以下是列表中的元素");
for ( Iterator<Integer> it=list.iterator();it.hasNext();)//使用迭代器
{
System.out.println(it.next());
}
}
}
~~~
### 總結:
在容器中我們可以看到分為了三類:列表(List),集合(Set)和映射(Map)不同的容器讓我們在不同的情況下去使用。比如List,方便通過索引查找對象。使用Set可以保證數據不重復,Map使用的是鍵值對。這些不同的容器各有千秋,掌握他們的一些特性能讓我們寫出更高效的程序。最后因為這些容器在操作上大致相同,所以寫了一個統一的接口來提供一個統一的操作。