国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JDK之HashMap、HashSet分析

2019-11-15 00:37:26
字體:
來源:轉載
供稿:網友
JDK之HashMap、HashSet分析

HashMap主要分析key、value的放入Map和取出Map操作以及他的遍歷器。個人覺得在HashMap中有個很重要的內部類Entry,Map的put,get等重要方法都是依靠這個Entry的。先來分析下這個內部類Entry,Entry中有幾個重要的變量key、value、next,不用說大家也會明白這幾個變量的含義,當然也自然會有get和set方法了。當我們在遍歷Map的時候,有一種方法就是獲取這個內部類的對象entry,然后去這個entry中取值。現在就以這個為例,遍歷一個Map。首先獲取Map的entrySet集,然后獲取迭代器:map.entrySet().iterator(),獲取以后使用next方法拿到Entry,最后在Entry中拿到可以和Value,這種方式是首先拿到map的Entry對象,然后去拿key和value。不同于另外一種遍歷方式:map.keySet().iterator(),他是先拿到key的集合,然后通過可以去取value。這兩種方式最后都能遍歷整個Map,但是實現的方式不一樣,使用的內部類也不一樣。遍歷器都是在內部類中產生的,要想使用遍歷器,必須使用內部類,其實在類中是不能直接調用Map中的內部類的,都是使用類中的方法,在方法中返回內部類的對象,從而去操縱內部類的方法,JDK源碼中很多類都是這樣操作的,這樣很好影藏了內部類,但是這種做法的好處,我暫時還沒有深刻體會,只覺得這樣做使用了java的代理模式,也實現了java的多重繼承(PS:希望有高手賜教這樣使用內部類的好處和意義)。現在很細MAP中的重要方法:put。put就是將key和value放入到MAP當中,他先會拿到這個map的遍歷這個map,拿到Entry,遍歷map,如果有value等于當前的value,則將替換這個entry中的value,返回當前的entry,這樣做是的map中key值對應的value永遠只有一個,且是最新的,如果沒有,則將當前這個key和value放入到entry中。在put的時候,map提供了putForNullKey方法,即,允許有key是null的,如果key是null的,則將key設置為null,跟普通的put一樣,只是在比較是否存在為null的key時,不需要比較他的hash值,直接比較即可。當然,putForNullKey是私有的,只能通過put調用。map還提供了containsValue和containsKey方法,其實現邏輯基本相同,都是變量Map,拿到Entry,然后比較key或者value。API中說Map中有兩個影響其性能的參數:初始容量 和加載因子,這個不太了解,需要進一步分析。

HashSet其實底層的實現都是依賴于HashMap的,或者說他的方法實現是調用HashMap方法的。如HashSet的構造方法,就是new了一個HashMap,當向Set中add元素時,就是想Map中put值,只不過value設置為PRESENT,其中PRESENT是一個全局的object類型的對象,可以說Set其實就是一個Map,只是這個Map的value都是一樣,是一個根類對象,只是key不同而已。由此可以想到為什么set中沒有重復值,原因是因為Map中key是唯一的,若有重復的key,則替換的是value,此處value都一樣,key肯定就唯一。當向set中添加相同元素時,都不需要異常處理,因為map的put實現方法決定了不會有異常的出現。set的其他方法不用過多分析,基本都是調用map中的方法。對于set的迭代器,他采用遍歷map的方式為上面講解的第二種map.keySet().iterator(),這樣拿到map的迭代器,從而迭代set。要想很好的理解set,其實只需要理解map即可。

之所以HashMap和HashSet放在一起分析,原因很明了,其實這篇文章就是在分析HashMap。(PS:此處分析的主要是Map工作中常用的方法,可能還有很多有趣且有用的方法未分析,當用到時,需要好好的看下源碼,理解這樣做的理由)。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高唐县| 瑞金市| 郑州市| 姜堰市| 甘洛县| 唐海县| 志丹县| 兰考县| 凌源市| 来凤县| 建始县| 抚顺县| 屏南县| 竹溪县| 建平县| 古丈县| 体育| 郓城县| 怀宁县| 确山县| 肇东市| 虹口区| 新巴尔虎左旗| 三明市| 司法| 庆云县| 泽州县| 行唐县| 扶沟县| 营口市| 石嘴山市| 获嘉县| 马尔康县| 平利县| 仁布县| 克拉玛依市| 宁乡县| 莱西市| 盱眙县| 崇左市| 调兵山市|