一、容器
常見的集合類有這些種:
實現Collection接口的:Set、List以及他們的實現類。
實現Map接口的:HashMap及其實現類
編程愛好者學習,下面我我們通過一個圖來整體描述一下:
這個圖片沒法顯示的很清楚,所以我將原始圖片上傳到了我的資源里:http://download.csdn.net/detail/zhangerqing/4711389。願意看清楚的就去下吧。
下面的表格也許可以更直接的表現出他們之間的區別和聯系:
接口
簡述
實現
操作特性
成員要求
Set
成員不能重復
HashSet
外部無序地遍歷成員
成員可為任意Object子類的對象,但如果覆蓋了equals方法,同時注意修改hashCode方法。
TreeSet
外部有序地遍歷成員;附加實現了SortedSet, 支持子集等要求順序的操作
成員要求實現caparable接口,或者使用 Comparator構造TreeSet。成員一般為同一類型。
LinkedHashSet
外部按成員的插入順序遍歷成員
成員與HashSet成員類似
List
提供基於索引的對成員的隨機訪問
ArrayList
提供快速的基於索引的成員訪問,對尾部成員的增加和刪除支持較好
成員可為任意Object子類的對象
LinkedList
對列表中任何位置的成員的增加和刪除支持較好,但對基於索引的成員訪問支持性能較差
成員可為任意Object子類的對象
Map
保存鍵值對成員,基於鍵找值操作,compareTo或compare方法對鍵排序
HashMap
能滿足用戶對Map的通用需求
鍵成員可為任意Object子類的對象,但如果覆蓋了equals方法,同時注意修改hashCode方法。
TreeMap
支持對鍵有序地遍歷,使用時建議先用HashMap增加和刪除成員,最后從HashMap生成TreeMap;附加實現了SortedMap接口,支持子Map等要求順序的操作
鍵成員要求實現caparable接口,或者使用Comparator構造TreeMap。鍵成員一般為同一類型。
LinkedHashMap
保留鍵的插入順序,用equals 方法檢查鍵和值的相等性
成員可為任意Object子類的對象,但如果覆蓋了equals方法,同時注意修改hashCode方法。
IdentityHashMap
使用== 來檢查鍵和值的相等性。
成員使用的是嚴格相等
WeakHashMap
其行為依賴於垃圾回收線程,沒有絕對理由則少用
(上圖來源於網友的總結,已不知是哪位的原創,恕不貼出地址,如原作者看到請聯系我,必將貼出鏈接!)
實現Collection接口的類,如Set和List,他們都是單值元素(其實Set內部也是采用的是Map來實現的,只是鍵值一樣,從表面理解,就是單值),不像實現Map接口的類一樣,里面存放的是key-value(鍵值對)形式的數據。這方面就造成他們很多的不同點,如遍歷方式,前者只能采用迭代或者循環來取出值,但是后者可以使用鍵來獲得值得值。
1、HashMap和HashTable
相同點:二者都實現了Map接口,因此具有一系列Map接口提供的方法。
不同點:
1、HashMap繼承了AbstractMap,而HashTable繼承了Dictionary。
2、HashMap非線程安全,HashTable線程安全,到處都是synchronized關鍵字。
3、因為HashMap沒有同步,所以處理起來效率較高。
4、HashMap鍵、值都允許為null,HashTable鍵、值都不允許有null。
5、HashTable使用Enumeration,HashMap使用Iterator。
1-1、HashMap和ConcurrentHashMap
ConcurrentHashMap是線程安全的HashMap的實現。同樣是線程安全的類,它與HashTable在同步方面有什么不同呢?
之前我們說,synchronized關鍵字加鎖的原理,其實是對對象加鎖,不論你是在方法前加synchronized還是語句塊前加,鎖住的都是對象整體,但是ConcurrentHashMap的同步機制和這個不同,它不是加synchronized關鍵字,而是基於lock操作的,這樣的目的是保證同步的時候,鎖住的不是整個對象。
2、Set接口和List接口
相同點:都實現了Collection接口
不同點:
1、Set接口不保證維護元素的順序,而且元素不能重復。List接口維護元素的順序,而且元素可以重復。
2、關於Set元素如何保證元素不重復,我將在下面的博文中給出。
3、ArrayList和LinkList
相同點:都實現了Collection接口
不同點:ArrayList基於數組,具有較高的查詢速度,而LinkedList基於雙向循環列表,具有較快的添加或者刪除的速度,二者的區別,其實就是數組和列表的區別。上文有詳細的分析。
4、SortedSet和SortedMap
二者都提供了排序的功能。來看一個小例子:
5、TreeMap和HashMap
HashMap具有較高的速度(查詢),TreeMap則提供了按照鍵進行排序的功能。
6、HashSet和LinkedHashSet
HashSet,為快速查找而設計的Set。存入HashSet的對象必須實現hashCode()和equals()。
LinkedHashSet,具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序),於是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。
7、TreeSet和HashSet
TreeSet:提供排序功能的Set,底層為樹結構。相比較HashSet其查詢速度低,如果只是進行元素的查詢,我們一般使用HashSet。
8、ArrayList和Vector
同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的。
數據增長:當需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半
9、Collection和Collections
Collection是一系列單值集合類的父接口,提供了基本的一些方法,而Collections則是一系列算法的集合。里面的屬性和方法基本都是static的,也就是說我們不需要實例化,直接可以使用類名來調用。下面是Collections類的一些功能列表:
二、迭代器
迭代器是一種設計模式,它是一個對象,它可以遍歷並選擇序列中的對象,而開發人員不需要了解該序列的底層結構。迭代器通常被稱為“輕量級”對象,因為創建它的代價小。
Java中的Iterator功能比較簡單,並且只能單向移動:
(1) 使用方法iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
(2) 使用next()獲得序列中的下一個元素。
(3) 使用hasNext()檢查序列中是否還有元素。
(4) 使用remove()將迭代器新返回的元素刪除。
Iterator是Java迭代器最簡單的實現,為List設計的ListIterator具有更多的功能,它可以從兩個方向遍歷List,也可以從List中插入和刪除元素。list l = new ArrayList();
l.add("aa");
l.add("bb");
l.add("cc");
for (Iterator iter = l.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用於while循環
Iterator iter = l.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
*/
注意:使用iterator時候,不能同時對容器進行刪減,否則會丟出異常concurrentdificationexception
如果有該方面的需求,可以使用派生的兄弟成員listIterator,只針對list,可以兩個方向遍歷,同時支持元素的修改