1 集合
Java集合大致分爲Set、List、Map、Queue。Set代表無序、不可重複的集合;List爲有序、可重複集合;Map爲有映射關係的集合;Queue代表隊列關係集合。
集合類主要由兩個接口派生而成:Collection和Map,關係樹如圖1.1與1.2所示:
圖1.1
圖1.2
有兩種方式遍歷集合元素:Iterator、foreach;但是迭代過程中,集合不能被修改。否則會拋出java.util.ConcurrentModificationException異常。Iterator可以通過iterator.remove()來刪除元素(刪除的是上一個迭代元素)
1.1 Set
Set的特徵:元素不能重複,判斷依據爲equals方法
1.1.1 HashSet/LinkedHashSet
特徵:採用hash算法存取元素,有較好的讀取性能。
HashSet判斷兩個元素相等的依據是兩個對象的hashcode與equals返回值均相等。因此重寫對象的equals方法返回true時,一定要保證它們的hashcode值也相等。
LinkedHashSet維護了元素的位置信息。迭代訪問時效果佳。
1.1.2 TreeSet
元素是排序的。如果放入的元素是對象,則該對象類需要實現Comparable接口指定排序依據。
注意:元素如果是可變對象,修改元素的屬性將影響集合特性,如元素無法刪除等。所以放入的元素最好是不可變對象。
定製排序:默認TreeSet爲自然排序;通過傳入Comparator改變排序規則:
- TreeSet ts = new TreeSet(new Comparator(){
- @Override
- public int compare(Object arg0, Object arg1) {
- //compare
- }});
1.1.3 EnumSet
枚舉集合,元素必須來自枚舉類。
1.2 List
判斷元素相同的依據是equals返回值
- class A {
- public boolean equals(Object o) {
- return true;
- }
- }
- ArrayList<String> list = new ArrayList<String>();
- list.add(“android”);
- list.remove(new A());// first element was deleted
結果第一個元素被刪除!
1.2.1 實現類
實現均是基於數組,封裝了可再分配的數組Object[],默認大小10,大數據量時,最好一次性賦予較大容量以提高性能。
void trimToSize(): 將List的容量調整爲實際使用大小,可節省空間。
Vector是線程安全的(現已不推薦使用)
1.3 Queue
1.3.1 LinkedList
實現List和Deque接口,即是一個雙向列表。內部以鏈表實現,增、刪效率高。
1.3.2 PriorityQueue
按元素大小排序的隊列。
1.4 Collection類使用建議
對於經常增加、刪除的操作,採用linkedList效果佳
對於訪問頻繁的,數組類型集合效率高
遍歷集合時,ArrayList、Vector等數組實現的結構採用隨機訪問get(i)方式效率較高,而LinkedList採用Iterator
1.5 HashMap與Hashtable
他們的區別類似於ArrayList與Vector:
1.HashMap是非線程安全,而Hashtable是線程安全
2,HashMap可以null作爲key或value,hashtable反之
如果以對象作爲key,需重寫對象的equals和hashcode方法
1.5.1 LinkedHashMap
保持了插入時的順序。
1.5.2 Properties
將屬性文件與map關聯,由於文件的鍵值均爲字符串,因此properties的key和value爲字符串類型。
1.5.3 TreeMap
即map的key是以TreeSet實現的,key相同的判斷依據是equals和compareTo都相同
1.5.4 WeakHashMap
HashMap的value做成了弱引用
1.5.5 IdentityHashMap
如名字所述,key的要求是必須”==”相同,即要求是同一對象或值
1.6 工具類
Collections中有大量幫助方法,可以分爲排序、查找、同步控制等,例舉比較實用的:
void sort(List list); 排序
int binarySearch(List list,Object obj);查找指定元素的下標,要求list已排序。
synchronizedXXX(XXX xxx); 創建同步集合。XXX可以是List、Set、Map