java集合类框架
原文出處:于衛(wèi)國,http://yuweiguocn.github.io/java-collection/
Java集合類框架概覽及各集合之間的區(qū)別。
集合中存放的是對象的引用。
Collections:集合的搜索、排序、線程安全化等
Collection接口
- boolean add(Object o)
- boolean addAll(Collection c)
- boolean remove(Object o)
- boolean removeAll(Collection c)去交集
- boolean retainAll(Collection c)取交集
- Iterator iterator()
- Object[] toArray()
- Object[] toArray(Object[] a)
Iterator接口
boolean hasNext()
Object next()
ListIterator接口
ListIterator是Iterator的子接口。
Iterator和ListIterator的區(qū)別
- 遍歷方法 ListIterator和Iterator都有hasNext()和next()方法,可以實(shí)現(xiàn)順序身后遍歷,但是ListIterator還有hasPrevious()和pervious()- 方法,可以實(shí)現(xiàn)逆向(順序向前)遍歷,Iterator就不可以。
- 遍歷索引定位 ListIterator 可以定位索引位置——nextIndex()和previousIndex(),Iterator沒有此功能。
- 增加集合對象元素方法 ListIterator有add方法,可以向List中添加對象,而Iterator不能。
- 對象維護(hù) 都可實(shí)現(xiàn)刪除對象,但ListIterator可以調(diào)用set方法來對集合元素進(jìn)行修改。而Iterator不能。
Map接口類型
Map接口實(shí)現(xiàn)者調(diào)用接口方法values()返回一個實(shí)現(xiàn)collection接口的對象引用。collection接口的實(shí)現(xiàn)者又可以調(diào)用iterator()方法返回一個實(shí)現(xiàn)Iterator接口的對象引用。
Map接口用于將一個鍵(key)映射到一個值(value),且不允許有重復(fù)的鍵。Map提供了一個稱為entrySet()的方法,這個方法返回一個實(shí)現(xiàn)Set接口的集合對象,集合中的每個對象元素又都實(shí)現(xiàn)了Map.Entry接口。Map.Entry接口提供了一個getKey()方法和一個getValue()方法。
集合對象排序接口Comparator
實(shí)現(xiàn)此接口的類可以進(jìn)行排序,實(shí)現(xiàn)compare方法就可以了。
基本數(shù)據(jù)類型實(shí)現(xiàn)了這個接口,調(diào)用Collections.sort(list)進(jìn)行排序;
如果Comparator只用一次,可使用匿名類。
List和Set的區(qū)別
List:
元素是有序的,因?yàn)樵摷象w系有索引
元素可以重復(fù)
Set:
元素是無序的
元素不可以重復(fù)
取出只能是Iterator
HashSet和TreeSet的區(qū)別
HashSet:
哈希表結(jié)構(gòu) 判斷是否重復(fù)用hashCode和equals方法
當(dāng)hashCode相等時判斷equals方法
TreeSet:
二叉樹結(jié)構(gòu),可以排序
Vector和ArrayList的區(qū)別
Vector:
線程同步
當(dāng)Vector中的元素超過它的初始大小時,Vector會將它的容量翻倍
ArrayList:
線程不同步,但性能很好
當(dāng)ArrayList中的元素超過它的初始大小時,ArrayList只增加50%的大小
ArrayList和LinkedList的區(qū)別
ArrayList:
底層是數(shù)組數(shù)據(jù)結(jié)構(gòu)
查詢快,增刪慢
LinkedList:
底層是鏈表數(shù)據(jù)結(jié)構(gòu)
增刪快,查詢慢
HashTable和HashMap的區(qū)別
HashTable:
線程同步
不允許key和value的值為null
HashMap:
線程不同步
允許一個key為null,和多個value為null
TreeMap和HashMap的區(qū)別
- TreeMap:
- 二叉樹結(jié)構(gòu)
- 線程不同步
- 可用于給map集合中的鍵進(jìn)行排序
- HashMap:
- 哈希表結(jié)構(gòu)
- 線程不同步
- 允許一個key為null,和多個value為null
hashCode的作用
哈希算法可以提高從集合中查找元素的效率,這種方式將集合分成若干個存儲區(qū)域,每個對象可以計(jì)算出一個哈希碼,可以將哈希碼分組,每組分別對應(yīng)某個存儲區(qū)域,根據(jù)一個對象的哈希碼就可以確定對象應(yīng)該存儲在哪個區(qū)域。hashCode在有哈希算法類的集合里才有價值,如hashSet、hashMap、hashTable。只有類的實(shí)例對象被要求采用哈希算法進(jìn)行存儲和檢索時,這個類才需要按要求覆蓋hashCode方法。
當(dāng)一個對象存儲進(jìn)hashSet集合中就不能再修改這個對象中的那些參與計(jì)算哈希值的字段了,否則,對象修改后的哈希值與最初存儲進(jìn)HashSet集合時的哈希值就不同了。這種情況下,即使在contains方法中使用該對象的當(dāng)前引用作為參數(shù)去HashSet集合中檢索對象,也將返回找不到對象的結(jié)果,這也會導(dǎo)致無法從HashSet集合中單獨(dú)刪除當(dāng)前對象,從而造成內(nèi)存泄露。
集合類的選擇
是否有線程安全問題
集合類的元素數(shù)量是否很大(很大應(yīng)該選擇Hash開頭的類,便于快速檢索)
哪種集合類的結(jié)構(gòu)方便當(dāng)前使用
Collections類
- Set singleton(Object o)
- List singletonList(Object o)
- Map singletonMap(Object key,Object value)
- 填充集合 nCopies(int length,Object o)
- 復(fù)制集合 copy(List dest,List src)
- 查找替換 boolean replaceAll(List list,Object oldVal,Object newVal)
- 集合排序 void sort(List list)
總結(jié)
- 上一篇: Android面试题集合
- 下一篇: 数据结构和算法:全面的算法代码库