Map集合类
映射的數(shù)學(xué)解釋:
設(shè)A、B是兩個(gè)非空集合,如果存在一個(gè)法則f,使得對A中的每個(gè)元素a,按法則f,在B中有唯一確定的元素b與之對應(yīng),則稱f為從A到B的映射,記作f:A→B。
映射關(guān)系(兩個(gè)集合):A集合和B集合.
A集合中的每一個(gè)元素都可以在B集合中找到唯一的一個(gè)值與之對應(yīng).
嚴(yán)格上說,Map并不是集合,而是兩個(gè)集合之間的映射關(guān)系(Map接口并沒有繼承于Collection接口),然而因?yàn)镸ap可以存儲數(shù)據(jù)(每次存儲都應(yīng)該存儲A集合中以一個(gè)元素(key),B集合中一個(gè)元素(value)),我們還是習(xí)慣把Map也稱之為集合.
因?yàn)?Map接口并沒有繼承于Collection接口也沒有繼承于Iterable接口,所以不能直接對Map使用for-each操作.
**Map的操作方法**
實(shí)現(xiàn)代碼:
**Set和Map之間的關(guān)系**
發(fā)現(xiàn)在Map和Set中有很多相類似的實(shí)現(xiàn)類名:
Set Map 算法
HashSet HashMap 哈希表
TreeSet TreeMap 紅黑樹
LinkedHashSet LinkedHashMap 哈希表/鏈表
等…
如果集合前綴相同,說明底層算法是一樣的,現(xiàn)在單獨(dú)使用HashSet和HashMap來研究.
通過閱讀源代碼:發(fā)現(xiàn),相同算法的Set底層用的是相同算法的Map.
把Set的集合對象作為Map的key,再使用一個(gè)Object常量作為value.
因此:更符合我們說的在Map中,所有的key就是一個(gè)Set集合.
**Map的實(shí)現(xiàn)類**Map的常用實(shí)現(xiàn)類:
HashMap: 采用哈希表算法, 此時(shí)Map中的key不會保證添加的先后順序,key也不允許重復(fù).
key判斷重復(fù)的標(biāo)準(zhǔn)是: key1和key2是否equals為true,并且hashCode相等.
TreeMap: 采用紅黑樹算法,此時(shí)Map中的key會按照自然順序或定制排序進(jìn)行排序,,key也不允許重復(fù).
key判斷重復(fù)的標(biāo)準(zhǔn)是: compareTo/compare的返回值是否為0.
LinkedHashMap: 采用鏈表和哈希表算法,此時(shí)Map中的key會保證先后添加的順序,key不允許重復(fù).
key判斷重復(fù)的標(biāo)準(zhǔn)和HashMap中的key的標(biāo)準(zhǔn)相同.
Hashtable: 采用哈希表算法,是HashMap的前身(類似于Vector是ArrayList的前身).打死不用.
在Java的集合框架之前,表示映射關(guān)系就使用Hashtable.
所有的方法都使用synchronized修飾符,線程安全的,但是性能相對HashMap較低.
Properties: Hashtable的子類,此時(shí)要求key和value都是String類型.
用來加載資源文件(properties文件(IO再講)).
一般的,我們定義Map,key都使用不可變的類(String),把key作為value的唯一名稱.
HashMap和TreeMap以及LinkedHashMap都是線程不安全的,但是性能較高:
解決方案: Map m = Collections.synchronizedMap(Map對象);
Hashtable類實(shí)現(xiàn)線程安全的,但是性能較低.
哈希表算法:做等值查詢最快.
數(shù)結(jié)構(gòu)算法:做范圍查詢最快–>應(yīng)用到索引上.
案例:
總結(jié)
- 上一篇: List实现类性能和特点分析
- 下一篇: sdut 马的走法