淺談Java集合框架
阿新 • • 發佈:2017-06-16
順序 eem map pre 叠代器 static 支持 print ted
集合框架最大的作用就是維護一組類型同樣的對象。
以下首先介紹集合的經常使用,隨後依據每種行為分別進行討論。
這個程序最後輸出的結果例如以下:
以上就是集合框架最簡單的樣例。盡管簡單,可是平時編碼的時候常常會用到。
使用鏈表進行實現的類有:LinkedList、HashMap、Hashtable。
使用數組實現的類有:ArrayList、Deque、Stack、Vector。
使用哈希表進行實現的類有:HashMap、HashSet、Hashtable、LinkedHashMap、LinkedHashSet、WeakHashMap。
使用紅黑樹實現的類有:TreeMap。
僅僅是不同的類有不同的行為和性能。通常關註下面這些行為:
- 是否能存放反復的元素
- 遍歷的順序是如何的
- 是否支持多線程
以下首先介紹集合的經常使用,隨後依據每種行為分別進行討論。
經常使用操作
經常使用的操作一般就是添加刪除查詢。經常使用的添加操作有add、addAll,經常使用的刪除操作有remove、removeAll。經常使用的讀取操作有contains、get、indexOf,還能夠通過叠代器進行遍歷。說這些比較抽象,以下就用代碼舉個樣例吧。import java.util.LinkedList; public class Main { public static void main(){ LinkedList<Integer> list = new LinkedList<Integer>(); // 添加三個元素 list.add(1); list.add(2); list.add(3); // 刪除一個元素 list.remove(2); // 輸出list中全部的元素 for(int e:list) { System.out.println(e); } } }
這個程序最後輸出的結果例如以下:
1 3
以上就是集合框架最簡單的樣例。盡管簡單,可是平時編碼的時候常常會用到。
反復值
除了Set和Map。其余的類都支持反復元素。對於Map。針對的是它的Key,也就是說它的Key不能反復,而Value隨便怎樣取值對能夠,就不在討論範圍了。
遍歷的順序
遍歷的順序是各種集合之間最大的差別。遍歷的順序一般有三種:依照插入順序進行遍歷、依照compareTo結果進行遍歷、無序遍歷。
依照插入順序進行遍歷的類有List、Vector、Stack、Queue、Deque、LinkedHashMap。當中Stack的遍歷順序和插入的順序是相反的。Deque是Stack和Queue合體。兩種順序都支持,並且性能更快。
依照compareTo結果進行遍歷的類有SortedMap、TreeMap、SortedSet、PriorityQueue。
無序遍歷的類有:HashMap、Set、Hashtable。
多線程
僅僅有早期版本號的集合類支持多線程,後來發現多線程不關集合框架的事,後來出現的類就都不支持多線程了。
所以。在Java的集合框架中,支持多線程的類僅僅有三個:Stack、Vector、Hashtable,這些都是早期的類,接口設計不良,性能一般,所以在新的project中一般不再使用。
除了這三個類。其它的類都不支持多線程。
假設確實須要用到多線程。能夠調用\path{Collections.synchronizedMap}或者\path {Collections.synchronizedSet}讓對象支持對線程。
算法細節
不同的類採用了不同的算法,整體上使用了鏈表、數組、哈希表、紅黑樹、堆這幾種算法。以下都是我閱讀了OpenJDK的源代碼之後總結出來的。使用鏈表進行實現的類有:LinkedList、HashMap、Hashtable。
使用數組實現的類有:ArrayList、Deque、Stack、Vector。
使用哈希表進行實現的類有:HashMap、HashSet、Hashtable、LinkedHashMap、LinkedHashSet、WeakHashMap。
使用紅黑樹實現的類有:TreeMap。
使用堆實現的類有:PriorityQueue。
淺談Java集合框架