Collection
├ List
│ ├ LinkedList(非線程安全)
│ ├ ArrayList(非線程安全)
│ └ Vector(線程安全)
│ └ Stack
└ Set(非線程安全)
│ ├ HashSet
│ └ TreeSet
Map
├ Hashtable(線程安全)
├ HashMap(非線程安全)
└ WeekHashMap
list、Set與Map
- List、Set都是繼承Collection接口,而Map不是
- List元素放入有序,可重復(fù),而Set元素放入無序,且不重復(fù)。List支持for循環(huán)便利,但Set不能(元素在Set中的位置是由該元素的HashCode決定,位置是固定的)
- Set檢索元素效率低,但刪除和插入效率高(因為插入和刪除不會引起元素位置改變);List查找效率高,但插入刪除效率低。
- Map適合儲存鍵值對的數(shù)據(jù)
ArrayList與LinkedList
ArrayList查詢效率高,插入刪除效率低
LinkedList查詢效率低,插入刪除效率高
原因:在于ArrayList是基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),地址連續(xù)。而LinkedList是基于鏈表的數(shù)據(jù)結(jié)構(gòu),地址是任意的,在開辟內(nèi)存空間的時候不需要等一個連續(xù)的地址。
public ArrayList()//構(gòu)造一個初始容量為10的空列表。
HashSet與Treeset
TreeSet是二叉樹(紅黑樹的樹據(jù)結(jié)構(gòu))實現(xiàn)的,Treeset中的數(shù)據(jù)是自動 排好序 的,不允許放入null值
HashSet是哈希表實現(xiàn)的,HashSet中的數(shù)據(jù)是 無序 的,可以放入null,但只能放入一個null
總結(jié)
- 如果涉及到堆棧,隊列等操作,應(yīng)該考慮用List
- 對于需要快速插入,刪除元素,應(yīng)該使用LinkedList
- 如果需要快速隨機(jī)訪問元素,應(yīng)該使用ArrayList
- 如果程序在單線程環(huán)境中,或者訪問僅僅在一個線程中進(jìn)行,考慮非同步的類,其效率較高,如果多個線程可能同時操作一個類,應(yīng)該使用同步的類
- 要特別注意對哈希表的操作,作為key的對象要正確復(fù)寫equals和hashCode方法
- 盡量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以后需要將ArrayList換成LinkedList時,客戶端代碼不用改變。這就是針對抽象編程。